This way, we can save one allocation and avoid copying the array
unnecesarily.
+ assert(bus);
+ assert(info);
+ assert(c);
+
KDBUS_ITEM_FOREACH(item, info, items) {
switch (item->type) {
KDBUS_ITEM_FOREACH(item, info, items) {
switch (item->type) {
case KDBUS_ITEM_AUXGROUPS:
if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
case KDBUS_ITEM_AUXGROUPS:
if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
- size_t i, n;
- uid_t *u;
- n = (item->size - offsetof(struct kdbus_item, data64)) / sizeof(uint64_t);
- u = new(uid_t, n);
- if (!u)
- return -ENOMEM;
+ assert_cc(sizeof(gid_t) == sizeof(uint32_t));
- for (i = 0; i < n; i++)
- u[i] = (uid_t) item->data64[i];
+ n = (item->size - offsetof(struct kdbus_item, data32)) / sizeof(uint32_t);
+ g = newdup(gid_t, item->data32, n);
+ if (!g)
+ return -ENOMEM;
- c->supplementary_gids = u;
+ free(c->supplementary_gids);
+ c->supplementary_gids = g;
c->n_supplementary_gids = n;
c->mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
c->n_supplementary_gids = n;
c->mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
strv_free(c->cmdline_array);
strv_free(c->well_known_names);
strv_free(c->cmdline_array);
strv_free(c->well_known_names);
-
- free(c->supplementary_gids);
}
_public_ sd_bus_creds *sd_bus_creds_ref(sd_bus_creds *c) {
}
_public_ sd_bus_creds *sd_bus_creds_ref(sd_bus_creds *c) {
free(c->unique_name);
free(c->cgroup_root);
free(c->description);
free(c->unique_name);
free(c->cgroup_root);
free(c->description);
+ free(c->supplementary_gids);
case KDBUS_ITEM_AUXGROUPS:
if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
case KDBUS_ITEM_AUXGROUPS:
if (bus->creds_mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
- size_t i, n;
- uid_t *u;
- n = (d->size - offsetof(struct kdbus_item, data32)) / sizeof(uint32_t);
- u = new(uid_t, n);
- if (!u) {
- r = -ENOMEM;
- goto fail;
- }
-
- for (i = 0; i < n; i++)
- u[i] = (uid_t) d->data32[i];
-
- m->creds.supplementary_gids = u;
- m->creds.n_supplementary_gids = n;
+ assert_cc(sizeof(gid_t) == sizeof(uint32_t));
+ m->creds.n_supplementary_gids = (d->size - offsetof(struct kdbus_item, data32)) / sizeof(uint32_t);
+ m->creds.supplementary_gids = (gid_t*) d->data32;
m->creds.mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
}
m->creds.mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS;
}