/** * \brief Add a new item into a group * * If the group is not big enough, the internal array of items is automatically * resized. An index of the new item is set to corresponding value. Other value * are set to default values (zeros). * \param[in,out] grp Pointer to the group * \return On success returns a pointer the to new item. Otherwise (memory * re-allocation error) returns NULL. */ static struct pevents_item * group_item_new(struct pevents_group *grp) { if (grp->all_size == grp->all_prealloc) { if (group_resize(grp, 2U * grp->all_prealloc)) { // Failed return NULL; } } struct pevents_item *new_item; if ((new_item = calloc(1, sizeof(*new_item))) == NULL) { MSG_ERROR(msg_module, "Unable to allocate memory (%s:%d)", __FILE__, __LINE__); return NULL; } new_item->idx = grp->all_size; // Set an index grp->all_ptr[grp->all_size++] = new_item; return new_item; }
static int cap_getgrcommon_r(cap_channel_t *chan, const char *cmd, const char *name, gid_t gid, struct group *grp, char *buffer, size_t bufsize, struct group **result) { nvlist_t *nvl; bool getgr_r; int error; nvl = nvlist_create(0); nvlist_add_string(nvl, "cmd", cmd); if (strcmp(cmd, "getgrent") == 0 || strcmp(cmd, "getgrent_r") == 0) { /* Add nothing. */ } else if (strcmp(cmd, "getgrnam") == 0 || strcmp(cmd, "getgrnam_r") == 0) { nvlist_add_string(nvl, "name", name); } else if (strcmp(cmd, "getgrgid") == 0 || strcmp(cmd, "getgrgid_r") == 0) { nvlist_add_number(nvl, "gid", (uint64_t)gid); } else { abort(); } nvl = cap_xfer_nvlist(chan, nvl, 0); if (nvl == NULL) { assert(errno != 0); *result = NULL; return (errno); } error = (int)nvlist_get_number(nvl, "error"); if (error != 0) { nvlist_destroy(nvl); *result = NULL; return (error); } if (!nvlist_exists_string(nvl, "gr_name")) { /* Not found. */ nvlist_destroy(nvl); *result = NULL; return (0); } getgr_r = (strcmp(cmd, "getgrent_r") == 0 || strcmp(cmd, "getgrnam_r") == 0 || strcmp(cmd, "getgrgid_r") == 0); for (;;) { error = group_unpack(nvl, grp, buffer, bufsize); if (getgr_r || error != ERANGE) break; assert(buffer == gbuffer); assert(bufsize == gbufsize); error = group_resize(); if (error != 0) break; /* Update pointers after resize. */ buffer = gbuffer; bufsize = gbufsize; } nvlist_destroy(nvl); if (error == 0) *result = grp; else *result = NULL; return (error); }