chiark / gitweb /
treewide: introduce UID_INVALID (and friends) as macro for (uid_t) -1
[elogind.git] / src / libsystemd / sd-bus / bus-kernel.c
index 58f011ff86b65a83827b420f382f2afc7e5ab76c..d81e9d25466193a37b633f70cdc4ee268ef2caaa 100644 (file)
@@ -135,6 +135,32 @@ static void append_fds(struct kdbus_item **d, const int fds[], unsigned n_fds) {
         *d = (struct kdbus_item *) ((uint8_t*) *d + (*d)->size);
 }
 
+static void add_bloom_arg(void *data, size_t size, unsigned n_hash, unsigned i, const char *t) {
+        char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
+        char *e;
+
+        assert(data);
+        assert(size > 0);
+        assert(i < 64);
+        assert(t);
+
+        e = stpcpy(buf, "arg");
+        if (i < 10)
+                *(e++) = '0' + (char) i;
+        else {
+                *(e++) = '0' + (char) (i / 10);
+                *(e++) = '0' + (char) (i % 10);
+        }
+
+        *e = 0;
+        bloom_add_pair(data, size, n_hash, buf, t);
+
+        strcpy(e, "-dot-prefix");
+        bloom_add_prefixes(data, size, n_hash, buf, t, '.');
+        strcpy(e, "-slash-prefix");
+        bloom_add_prefixes(data, size, n_hash, buf, t, '/');
+}
+
 static int bus_message_setup_bloom(sd_bus_message *m, struct kdbus_bloom_filter *bloom) {
         void *data;
         unsigned i;
@@ -164,39 +190,42 @@ static int bus_message_setup_bloom(sd_bus_message *m, struct kdbus_bloom_filter
                 return r;
 
         for (i = 0; i < 64; i++) {
+                const char *t, *contents;
                 char type;
-                const char *t;
-                char buf[sizeof("arg")-1 + 2 + sizeof("-slash-prefix")];
-                char *e;
 
-                r = sd_bus_message_peek_type(m, &type, NULL);
+                r = sd_bus_message_peek_type(m, &type, &contents);
                 if (r < 0)
                         return r;
 
-                if (type != SD_BUS_TYPE_STRING &&
-                    type != SD_BUS_TYPE_OBJECT_PATH &&
-                    type != SD_BUS_TYPE_SIGNATURE)
-                        break;
+                if (IN_SET(type, SD_BUS_TYPE_STRING, SD_BUS_TYPE_OBJECT_PATH, SD_BUS_TYPE_SIGNATURE)) {
 
-                r = sd_bus_message_read_basic(m, type, &t);
-                if (r < 0)
-                        return r;
+                        /* The bloom filter includes simple strings of any kind */
+                        r = sd_bus_message_read_basic(m, type, &t);
+                        if (r < 0)
+                                return r;
 
-                e = stpcpy(buf, "arg");
-                if (i < 10)
-                        *(e++) = '0' + (char) i;
-                else {
-                        *(e++) = '0' + (char) (i / 10);
-                        *(e++) = '0' + (char) (i % 10);
-                }
+                        add_bloom_arg(data, m->bus->bloom_size, m->bus->bloom_n_hash, i, t);
+                } if (type == SD_BUS_TYPE_ARRAY && STR_IN_SET(contents, "s", "o", "g")) {
 
-                *e = 0;
-                bloom_add_pair(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t);
+                        /* As well as array of simple strings of any kinds */
+                        r = sd_bus_message_enter_container(m, type, contents);
+                        if (r < 0)
+                                return r;
+
+                        while ((r = sd_bus_message_read_basic(m, contents[0], &t)) > 0)
+                                add_bloom_arg(data, m->bus->bloom_size, m->bus->bloom_n_hash, i, t);
+                        if (r < 0)
+                                return r;
 
-                strcpy(e, "-dot-prefix");
-                bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t, '.');
-                strcpy(e, "-slash-prefix");
-                bloom_add_prefixes(data, m->bus->bloom_size, m->bus->bloom_n_hash, buf, t, '/');
+                        r = sd_bus_message_exit_container(m);
+                        if (r < 0)
+                                return r;
+
+                } else
+                        /* Stop adding to bloom filter as soon as we
+                         * run into the first argument we cannot add
+                         * to it. */
+                        break;
         }
 
         return 0;
@@ -551,42 +580,42 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
 
                         /* EUID/SUID/FSUID/EGID/SGID/FSGID might be missing too (see above). */
 
-                        if ((uid_t) d->creds.uid != (uid_t) -1) {
+                        if ((uid_t) d->creds.uid != UID_INVALID) {
                                 m->creds.uid = (uid_t) d->creds.uid;
                                 m->creds.mask |= SD_BUS_CREDS_UID & bus->creds_mask;
                         }
 
-                        if ((uid_t) d->creds.euid != (uid_t) -1) {
+                        if ((uid_t) d->creds.euid != UID_INVALID) {
                                 m->creds.euid = (uid_t) d->creds.euid;
                                 m->creds.mask |= SD_BUS_CREDS_EUID & bus->creds_mask;
                         }
 
-                        if ((uid_t) d->creds.suid != (uid_t) -1) {
+                        if ((uid_t) d->creds.suid != UID_INVALID) {
                                 m->creds.suid = (uid_t) d->creds.suid;
                                 m->creds.mask |= SD_BUS_CREDS_SUID & bus->creds_mask;
                         }
 
-                        if ((uid_t) d->creds.fsuid != (uid_t) -1) {
+                        if ((uid_t) d->creds.fsuid != UID_INVALID) {
                                 m->creds.fsuid = (uid_t) d->creds.fsuid;
                                 m->creds.mask |= SD_BUS_CREDS_FSUID & bus->creds_mask;
                         }
 
-                        if ((gid_t) d->creds.gid != (gid_t) -1) {
+                        if ((gid_t) d->creds.gid != GID_INVALID) {
                                 m->creds.gid = (gid_t) d->creds.gid;
                                 m->creds.mask |= SD_BUS_CREDS_GID & bus->creds_mask;
                         }
 
-                        if ((gid_t) d->creds.egid != (gid_t) -1) {
+                        if ((gid_t) d->creds.egid != GID_INVALID) {
                                 m->creds.egid = (gid_t) d->creds.egid;
                                 m->creds.mask |= SD_BUS_CREDS_EGID & bus->creds_mask;
                         }
 
-                        if ((gid_t) d->creds.sgid != (gid_t) -1) {
+                        if ((gid_t) d->creds.sgid != GID_INVALID) {
                                 m->creds.sgid = (gid_t) d->creds.sgid;
                                 m->creds.mask |= SD_BUS_CREDS_SGID & bus->creds_mask;
                         }
 
-                        if ((gid_t) d->creds.fsgid != (gid_t) -1) {
+                        if ((gid_t) d->creds.fsgid != GID_INVALID) {
                                 m->creds.fsgid = (gid_t) d->creds.fsgid;
                                 m->creds.mask |= SD_BUS_CREDS_FSGID & bus->creds_mask;
                         }
@@ -642,7 +671,7 @@ static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
                                 m->creds.mask |= SD_BUS_CREDS_AUDIT_SESSION_ID & bus->creds_mask;
                         }
 
-                        if ((uid_t) d->audit.loginuid != (uid_t) -1) {
+                        if ((uid_t) d->audit.loginuid != UID_INVALID) {
                                 m->creds.audit_login_uid = (uid_t) d->audit.loginuid;
                                 m->creds.mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID & bus->creds_mask;
                         }