chiark / gitweb /
bus: update PORTING-DBUS1
[elogind.git] / src / libsystemd-bus / bus-creds.c
index 9d90c49c1ee6ceae04a810e0afdd81188c92e9cc..b2cf687377ef2141e0fc4322132c0cd56bbbae1c 100644 (file)
@@ -91,6 +91,7 @@ _public_ sd_bus_creds *sd_bus_creds_unref(sd_bus_creds *c) {
                         free(c->capability);
                         free(c->label);
                         free(c->unique_name);
+                        free(c->cgroup_root);
                         free(c);
                 }
         } else {
@@ -157,7 +158,9 @@ _public_ int sd_bus_creds_new_from_pid(pid_t pid, uint64_t mask, sd_bus_creds **
 _public_ int sd_bus_creds_get_uid(sd_bus_creds *c, uid_t *uid) {
         assert_return(c, -EINVAL);
         assert_return(uid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_UID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_UID))
+                return -ENODATA;
 
         *uid = c->uid;
         return 0;
@@ -166,7 +169,9 @@ _public_ int sd_bus_creds_get_uid(sd_bus_creds *c, uid_t *uid) {
 _public_ int sd_bus_creds_get_gid(sd_bus_creds *c, gid_t *gid) {
         assert_return(c, -EINVAL);
         assert_return(gid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_UID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_UID))
+                return -ENODATA;
 
         *gid = c->gid;
         return 0;
@@ -175,7 +180,9 @@ _public_ int sd_bus_creds_get_gid(sd_bus_creds *c, gid_t *gid) {
 _public_ int sd_bus_creds_get_pid(sd_bus_creds *c, pid_t *pid) {
         assert_return(c, -EINVAL);
         assert_return(pid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_PID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_PID))
+                return -ENODATA;
 
         assert(c->pid > 0);
         *pid = c->pid;
@@ -185,7 +192,9 @@ _public_ int sd_bus_creds_get_pid(sd_bus_creds *c, pid_t *pid) {
 _public_ int sd_bus_creds_get_tid(sd_bus_creds *c, pid_t *tid) {
         assert_return(c, -EINVAL);
         assert_return(tid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_TID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_TID))
+                return -ENODATA;
 
         assert(c->tid > 0);
         *tid = c->tid;
@@ -195,7 +204,9 @@ _public_ int sd_bus_creds_get_tid(sd_bus_creds *c, pid_t *tid) {
 _public_ int sd_bus_creds_get_pid_starttime(sd_bus_creds *c, uint64_t *usec) {
         assert_return(c, -EINVAL);
         assert_return(usec, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_PID_STARTTIME, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_PID_STARTTIME))
+                return -ENODATA;
 
         assert(c->pid_starttime > 0);
         *usec = c->pid_starttime;
@@ -204,7 +215,9 @@ _public_ int sd_bus_creds_get_pid_starttime(sd_bus_creds *c, uint64_t *usec) {
 
 _public_ int sd_bus_creds_get_selinux_context(sd_bus_creds *c, const char **ret) {
         assert_return(c, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_SELINUX_CONTEXT, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_SELINUX_CONTEXT))
+                return -ENODATA;
 
         assert(c->label);
         *ret = c->label;
@@ -214,7 +227,9 @@ _public_ int sd_bus_creds_get_selinux_context(sd_bus_creds *c, const char **ret)
 _public_ int sd_bus_creds_get_comm(sd_bus_creds *c, const char **ret) {
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_COMM, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_COMM))
+                return -ENODATA;
 
         assert(c->comm);
         *ret = c->comm;
@@ -224,7 +239,9 @@ _public_ int sd_bus_creds_get_comm(sd_bus_creds *c, const char **ret) {
 _public_ int sd_bus_creds_get_tid_comm(sd_bus_creds *c, const char **ret) {
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_TID_COMM, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_TID_COMM))
+                return -ENODATA;
 
         assert(c->tid_comm);
         *ret = c->tid_comm;
@@ -234,7 +251,9 @@ _public_ int sd_bus_creds_get_tid_comm(sd_bus_creds *c, const char **ret) {
 _public_ int sd_bus_creds_get_exe(sd_bus_creds *c, const char **ret) {
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_EXE, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_EXE))
+                return -ENODATA;
 
         assert(c->exe);
         *ret = c->exe;
@@ -244,7 +263,9 @@ _public_ int sd_bus_creds_get_exe(sd_bus_creds *c, const char **ret) {
 _public_ int sd_bus_creds_get_cgroup(sd_bus_creds *c, const char **ret) {
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_CGROUP, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_CGROUP))
+                return -ENODATA;
 
         assert(c->cgroup);
         *ret = c->cgroup;
@@ -256,12 +277,20 @@ _public_ int sd_bus_creds_get_unit(sd_bus_creds *c, const char **ret) {
 
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_UNIT, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_UNIT))
+                return -ENODATA;
 
         assert(c->cgroup);
 
         if (!c->unit) {
-                r = cg_path_get_unit(c->cgroup, (char**) &c->unit);
+                const char *shifted;
+
+                r = cg_shift_path(c->cgroup, c->cgroup_root, &shifted);
+                if (r < 0)
+                        return r;
+
+                r = cg_path_get_unit(shifted, (char**) &c->unit);
                 if (r < 0)
                         return r;
         }
@@ -275,12 +304,20 @@ _public_ int sd_bus_creds_get_user_unit(sd_bus_creds *c, const char **ret) {
 
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_USER_UNIT, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_USER_UNIT))
+                return -ENODATA;
 
         assert(c->cgroup);
 
         if (!c->user_unit) {
-                r = cg_path_get_user_unit(c->cgroup, (char**) &c->user_unit);
+                const char *shifted;
+
+                r = cg_shift_path(c->cgroup, c->cgroup_root, &shifted);
+                if (r < 0)
+                        return r;
+
+                r = cg_path_get_user_unit(shifted, (char**) &c->user_unit);
                 if (r < 0)
                         return r;
         }
@@ -294,12 +331,20 @@ _public_ int sd_bus_creds_get_slice(sd_bus_creds *c, const char **ret) {
 
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_SLICE, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_SLICE))
+                return -ENODATA;
 
         assert(c->cgroup);
 
         if (!c->slice) {
-                r = cg_path_get_slice(c->cgroup, (char**) &c->slice);
+                const char *shifted;
+
+                r = cg_shift_path(c->cgroup, c->cgroup_root, &shifted);
+                if (r < 0)
+                        return r;
+
+                r = cg_path_get_slice(shifted, (char**) &c->slice);
                 if (r < 0)
                         return r;
         }
@@ -313,12 +358,20 @@ _public_ int sd_bus_creds_get_session(sd_bus_creds *c, const char **ret) {
 
         assert_return(c, -EINVAL);
         assert_return(ret, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_SESSION, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_SESSION))
+                return -ENODATA;
 
         assert(c->cgroup);
 
         if (!c->session) {
-                r = cg_path_get_session(c->cgroup, (char**) &c->session);
+                const char *shifted;
+
+                r = cg_shift_path(c->cgroup, c->cgroup_root, &shifted);
+                if (r < 0)
+                        return r;
+
+                r = cg_path_get_session(shifted, (char**) &c->session);
                 if (r < 0)
                         return r;
         }
@@ -328,20 +381,31 @@ _public_ int sd_bus_creds_get_session(sd_bus_creds *c, const char **ret) {
 }
 
 _public_ int sd_bus_creds_get_owner_uid(sd_bus_creds *c, uid_t *uid) {
+        const char *shifted;
+        int r;
+
         assert_return(c, -EINVAL);
         assert_return(uid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_OWNER_UID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_OWNER_UID))
+                return -ENODATA;
 
         assert(c->cgroup);
 
-        return cg_path_get_owner_uid(c->cgroup, uid);
+        r = cg_shift_path(c->cgroup, c->cgroup_root, &shifted);
+        if (r < 0)
+                return r;
+
+        return cg_path_get_owner_uid(shifted, uid);
 }
 
 _public_ int sd_bus_creds_get_cmdline(sd_bus_creds *c, char ***cmdline) {
         assert_return(c, -EINVAL);
-        assert_return(c->cmdline, -ESRCH);
-        assert_return(c->mask & SD_BUS_CREDS_CMDLINE, -ENODATA);
 
+        if (!(c->mask & SD_BUS_CREDS_CMDLINE))
+                return -ENODATA;
+
+        assert_return(c->cmdline, -ESRCH);
         assert(c->cmdline);
 
         if (!c->cmdline_array) {
@@ -357,7 +421,9 @@ _public_ int sd_bus_creds_get_cmdline(sd_bus_creds *c, char ***cmdline) {
 _public_ int sd_bus_creds_get_audit_session_id(sd_bus_creds *c, uint32_t *sessionid) {
         assert_return(c, -EINVAL);
         assert_return(sessionid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_AUDIT_SESSION_ID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_AUDIT_SESSION_ID))
+                return -ENODATA;
 
         *sessionid = c->audit_session_id;
         return 0;
@@ -366,7 +432,9 @@ _public_ int sd_bus_creds_get_audit_session_id(sd_bus_creds *c, uint32_t *sessio
 _public_ int sd_bus_creds_get_audit_login_uid(sd_bus_creds *c, uid_t *uid) {
         assert_return(c, -EINVAL);
         assert_return(uid, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_AUDIT_LOGIN_UID, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_AUDIT_LOGIN_UID))
+                return -ENODATA;
 
         *uid = c->audit_login_uid;
         return 0;
@@ -375,7 +443,9 @@ _public_ int sd_bus_creds_get_audit_login_uid(sd_bus_creds *c, uid_t *uid) {
 _public_ int sd_bus_creds_get_unique_name(sd_bus_creds *c, const char **unique_name) {
         assert_return(c, -EINVAL);
         assert_return(unique_name, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_UNIQUE_NAME, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_UNIQUE_NAME))
+                return -ENODATA;
 
         *unique_name = c->unique_name;
         return 0;
@@ -384,7 +454,9 @@ _public_ int sd_bus_creds_get_unique_name(sd_bus_creds *c, const char **unique_n
 _public_ int sd_bus_creds_get_well_known_names(sd_bus_creds *c, char ***well_known_names) {
         assert_return(c, -EINVAL);
         assert_return(well_known_names, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_WELL_KNOWN_NAMES, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_WELL_KNOWN_NAMES))
+                return -ENODATA;
 
         *well_known_names = c->well_known_names;
         return 0;
@@ -406,7 +478,9 @@ static int has_cap(sd_bus_creds *c, unsigned offset, int capability) {
 _public_ int sd_bus_creds_has_effective_cap(sd_bus_creds *c, int capability) {
         assert_return(c, -EINVAL);
         assert_return(capability >= 0, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_EFFECTIVE_CAPS, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_EFFECTIVE_CAPS))
+                return -ENODATA;
 
         return has_cap(c, CAP_OFFSET_EFFECTIVE, capability);
 }
@@ -414,7 +488,9 @@ _public_ int sd_bus_creds_has_effective_cap(sd_bus_creds *c, int capability) {
 _public_ int sd_bus_creds_has_permitted_cap(sd_bus_creds *c, int capability) {
         assert_return(c, -EINVAL);
         assert_return(capability >= 0, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_PERMITTED_CAPS, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_PERMITTED_CAPS))
+                return -ENODATA;
 
         return has_cap(c, CAP_OFFSET_PERMITTED, capability);
 }
@@ -422,7 +498,9 @@ _public_ int sd_bus_creds_has_permitted_cap(sd_bus_creds *c, int capability) {
 _public_ int sd_bus_creds_has_inheritable_cap(sd_bus_creds *c, int capability) {
         assert_return(c, -EINVAL);
         assert_return(capability >= 0, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_INHERITABLE_CAPS, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_INHERITABLE_CAPS))
+                return -ENODATA;
 
         return has_cap(c, CAP_OFFSET_INHERITABLE, capability);
 }
@@ -430,7 +508,9 @@ _public_ int sd_bus_creds_has_inheritable_cap(sd_bus_creds *c, int capability) {
 _public_ int sd_bus_creds_has_bounding_cap(sd_bus_creds *c, int capability) {
         assert_return(c, -EINVAL);
         assert_return(capability >= 0, -EINVAL);
-        assert_return(c->mask & SD_BUS_CREDS_BOUNDING_CAPS, -ENODATA);
+
+        if (!(c->mask & SD_BUS_CREDS_BOUNDING_CAPS))
+                return -ENODATA;
 
         return has_cap(c, CAP_OFFSET_BOUNDING, capability);
 }
@@ -663,6 +743,10 @@ int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
                 if (r < 0)
                         return r;
 
+                r = cg_get_root_path(&c->cgroup_root);
+                if (r < 0)
+                        return r;
+
                 c->mask |= missing & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_OWNER_UID);
         }
 
@@ -768,6 +852,10 @@ int bus_creds_extend_by_pid(sd_bus_creds *c, uint64_t mask, sd_bus_creds **ret)
                 if (!n->cgroup)
                         return -ENOMEM;
 
+                n->cgroup_root = strdup(c->cgroup_root);
+                if (!n->cgroup_root)
+                        return -ENOMEM;
+
                 n->mask |= mask & (SD_BUS_CREDS_CGROUP|SD_BUS_CREDS_SESSION|SD_BUS_CREDS_UNIT|SD_BUS_CREDS_USER_UNIT|SD_BUS_CREDS_SLICE|SD_BUS_CREDS_OWNER_UID);
         }