chiark / gitweb /
sd-bus: given that the kernel now passes the auxgroups list as 32bit array to us...
authorLennart Poettering <lennart@poettering.net>
Wed, 26 Nov 2014 13:59:12 +0000 (14:59 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 26 Nov 2014 13:59:12 +0000 (14:59 +0100)
This way, we can save one allocation and avoid copying the array
unnecesarily.

src/libsystemd/sd-bus/bus-control.c
src/libsystemd/sd-bus/bus-creds.c
src/libsystemd/sd-bus/bus-kernel.c

index 9cd5cd5fb6df0f67765f41f73f6a1b13232eda6e..758715d74e34b119ad8139bcbf26622e53dc9eea 100644 (file)
@@ -402,6 +402,10 @@ static int bus_populate_creds_from_items(
         uint64_t m;
         int r;
 
+        assert(bus);
+        assert(info);
+        assert(c);
+
         KDBUS_ITEM_FOREACH(item, info, items) {
 
                 switch (item->type) {
@@ -590,18 +594,18 @@ static int bus_populate_creds_from_items(
 
                 case KDBUS_ITEM_AUXGROUPS:
                         if (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS) {
-                                size_t i, n;
-                                uid_t *u;
+                                size_t n;
+                                uid_t *g;
 
-                                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;
index 43315b5b50207d44cf126765ea08f5467174f0d9..8aa53362fba038cf8b14512ac10e4443e40f38c9 100644 (file)
@@ -53,8 +53,6 @@ void bus_creds_done(sd_bus_creds *c) {
 
         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) {
@@ -97,6 +95,7 @@ _public_ sd_bus_creds *sd_bus_creds_unref(sd_bus_creds *c) {
                         free(c->unique_name);
                         free(c->cgroup_root);
                         free(c->description);
+                        free(c->supplementary_gids);
                         free(c);
                 }
         } else {
index 907c5c5cf6458fbda0887a1c8c5eaca8bcfb4a6c..2beaa892bca66de40c370af3cf9044a590c4a092 100644 (file)
@@ -677,21 +677,10 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                 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;
                         }