chiark / gitweb /
bus-proxy: fix compat with autostarted services
[elogind.git] / src / libsystemd / sd-bus / bus-control.c
index 71fdbcf948856036840504ace8ba0ef55108a9c1..6a9e9b296ad2df56277b415b9845381e8e946688 100644 (file)
@@ -414,42 +414,42 @@ static int bus_populate_creds_from_items(
 
                 case KDBUS_ITEM_CREDS:
 
-                        if (mask & SD_BUS_CREDS_UID && (uid_t) item->creds.uid != (uid_t) -1) {
+                        if (mask & SD_BUS_CREDS_UID && (uid_t) item->creds.uid != UID_INVALID) {
                                 c->uid = (uid_t) item->creds.uid;
                                 c->mask |= SD_BUS_CREDS_UID;
                         }
 
-                        if (mask & SD_BUS_CREDS_EUID && (uid_t) item->creds.euid != (uid_t) -1) {
+                        if (mask & SD_BUS_CREDS_EUID && (uid_t) item->creds.euid != UID_INVALID) {
                                 c->euid = (uid_t) item->creds.euid;
                                 c->mask |= SD_BUS_CREDS_EUID;
                         }
 
-                        if (mask & SD_BUS_CREDS_SUID && (uid_t) item->creds.suid != (uid_t) -1) {
+                        if (mask & SD_BUS_CREDS_SUID && (uid_t) item->creds.suid != UID_INVALID) {
                                 c->suid = (uid_t) item->creds.suid;
                                 c->mask |= SD_BUS_CREDS_SUID;
                         }
 
-                        if (mask & SD_BUS_CREDS_FSUID && (uid_t) item->creds.fsuid != (uid_t) -1) {
+                        if (mask & SD_BUS_CREDS_FSUID && (uid_t) item->creds.fsuid != UID_INVALID) {
                                 c->fsuid = (uid_t) item->creds.fsuid;
                                 c->mask |= SD_BUS_CREDS_FSUID;
                         }
 
-                        if (mask & SD_BUS_CREDS_GID && (gid_t) item->creds.gid != (gid_t) -1) {
+                        if (mask & SD_BUS_CREDS_GID && (gid_t) item->creds.gid != GID_INVALID) {
                                 c->gid = (gid_t) item->creds.gid;
                                 c->mask |= SD_BUS_CREDS_GID;
                         }
 
-                        if (mask & SD_BUS_CREDS_EGID && (gid_t) item->creds.egid != (gid_t) -1) {
+                        if (mask & SD_BUS_CREDS_EGID && (gid_t) item->creds.egid != GID_INVALID) {
                                 c->egid = (gid_t) item->creds.egid;
                                 c->mask |= SD_BUS_CREDS_EGID;
                         }
 
-                        if (mask & SD_BUS_CREDS_SGID && (gid_t) item->creds.sgid != (gid_t) -1) {
+                        if (mask & SD_BUS_CREDS_SGID && (gid_t) item->creds.sgid != GID_INVALID) {
                                 c->sgid = (gid_t) item->creds.sgid;
                                 c->mask |= SD_BUS_CREDS_SGID;
                         }
 
-                        if (mask & SD_BUS_CREDS_FSGID && (gid_t) item->creds.fsgid != (gid_t) -1) {
+                        if (mask & SD_BUS_CREDS_FSGID && (gid_t) item->creds.fsgid != GID_INVALID) {
                                 c->fsgid = (gid_t) item->creds.fsgid;
                                 c->mask |= SD_BUS_CREDS_FSGID;
                         }
@@ -549,7 +549,7 @@ static int bus_populate_creds_from_items(
                                 c->mask |= SD_BUS_CREDS_AUDIT_SESSION_ID;
                         }
 
-                        if (mask & SD_BUS_CREDS_AUDIT_LOGIN_UID && (uid_t) item->audit.loginuid != (uid_t) -1) {
+                        if (mask & SD_BUS_CREDS_AUDIT_LOGIN_UID && (uid_t) item->audit.loginuid != UID_INVALID) {
                                 c->audit_login_uid = (uid_t) item->audit.loginuid;
                                 c->mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID;
                         }
@@ -600,10 +600,11 @@ static int bus_populate_creds_from_items(
         return 0;
 }
 
-static int bus_get_name_creds_kdbus(
+int bus_get_name_creds_kdbus(
                 sd_bus *bus,
                 const char *name,
                 uint64_t mask,
+                bool allow_activator,
                 sd_bus_creds **creds) {
 
         _cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
@@ -652,7 +653,7 @@ static int bus_get_name_creds_kdbus(
         conn_info = (struct kdbus_info *) ((uint8_t *) bus->kdbus_buffer + cmd->offset);
 
         /* Non-activated names are considered not available */
-        if (conn_info->flags & KDBUS_HELLO_ACTIVATOR) {
+        if (!allow_activator && (conn_info->flags & KDBUS_HELLO_ACTIVATOR)) {
                 if (name[0] == ':')
                         r = -ENXIO;
                 else
@@ -875,7 +876,7 @@ _public_ int sd_bus_get_name_creds(
                 return -ENOTCONN;
 
         if (bus->is_kernel)
-                return bus_get_name_creds_kdbus(bus, name, mask, creds);
+                return bus_get_name_creds_kdbus(bus, name, mask, false, creds);
         else
                 return bus_get_name_creds_dbus1(bus, name, mask, creds);
 }
@@ -946,12 +947,12 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **
                         c->mask |= SD_BUS_CREDS_PID & mask;
                 }
 
-                if (bus->ucred.uid != (uid_t) -1) {
+                if (bus->ucred.uid != UID_INVALID) {
                         c->uid = bus->ucred.uid;
                         c->mask |= SD_BUS_CREDS_UID & mask;
                 }
 
-                if (bus->ucred.gid != (gid_t) -1) {
+                if (bus->ucred.gid != GID_INVALID) {
                         c->gid = bus->ucred.gid;
                         c->mask |= SD_BUS_CREDS_GID & mask;
                 }