diff options
author | Lennart Poettering <lennart@poettering.net> | 2017-12-30 15:19:15 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-01-04 13:28:24 +0100 |
commit | 18ac4643cb8f664a02c609f945179ab0951a92ae (patch) | |
tree | 6b10c2b4a595d0fbdd9f8dda7ec1e310761ad0c3 /src/libsystemd/sd-bus/bus-control.c | |
parent | 2fce06b0d6da5c8a6e100db77ab47c44cc0047cb (diff) | |
download | systemd-18ac4643cb8f664a02c609f945179ab0951a92ae.tar.gz |
sd-bus: use SO_PEERGROUPS when available to identify groups of peer
Diffstat (limited to 'src/libsystemd/sd-bus/bus-control.c')
-rw-r--r-- | src/libsystemd/sd-bus/bus-control.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c index ffe0af2ce7..0b39115d16 100644 --- a/src/libsystemd/sd-bus/bus-control.c +++ b/src/libsystemd/sd-bus/bus-control.c @@ -555,15 +555,16 @@ _public_ int sd_bus_get_name_creds( static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **ret) { _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *c = NULL; pid_t pid = 0; - bool do_label; + bool do_label, do_groups; int r; assert(bus); do_label = bus->label && (mask & SD_BUS_CREDS_SELINUX_CONTEXT); + do_groups = bus->n_groups != (size_t) -1 && (mask & SD_BUS_CREDS_SUPPLEMENTARY_GIDS); /* Avoid allocating anything if we have no chance of returning useful data */ - if (!bus->ucred_valid && !do_label) + if (!bus->ucred_valid && !do_label && !do_groups) return -ENODATA; c = bus_creds_new(); @@ -595,6 +596,16 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds ** c->mask |= SD_BUS_CREDS_SELINUX_CONTEXT; } + if (do_groups) { + c->supplementary_gids = newdup(gid_t, bus->groups, bus->n_groups); + if (!c->supplementary_gids) + return -ENOMEM; + + c->n_supplementary_gids = bus->n_groups; + + c->mask |= SD_BUS_CREDS_SUPPLEMENTARY_GIDS; + } + r = bus_creds_add_more(c, mask, pid, 0); if (r < 0) return r; |