From: Mike Yuan Date: Tue, 26 Mar 2024 12:59:32 +0000 (+0800) Subject: bus-util: dedup bus_set_address_capsule X-Git-Tag: v256-rc1~393^2 X-Git-Url: http://git-history.diyao.me/?a=commitdiff_plain;h=8e34fdb884cc2dd7396313748193fed632fedd56;p=systemd%2F.git bus-util: dedup bus_set_address_capsule Follow-up for ad963c3f5680796ccd094b81f35ff7aa20b57247 --- diff --git a/src/shared/bus-util.c b/src/shared/bus-util.c index 842e747c50..9a480aa0e3 100644 --- a/src/shared/bus-util.c +++ b/src/shared/bus-util.c @@ -280,6 +280,8 @@ static int pin_capsule_socket(const char *capsule, const char *suffix, uid_t *re assert(capsule); assert(suffix); + assert(ret_uid); + assert(ret_gid); p = path_join("/run/capsules", capsule, suffix); if (!p) @@ -291,7 +293,7 @@ static int pin_capsule_socket(const char *capsule, const char *suffix, uid_t *re return r; if (fstat(inode_fd, &st) < 0) - return -errno; + return negative_errno(); /* Paranoid safety check */ if (uid_is_system(st.st_uid) || gid_is_system(st.st_gid)) @@ -303,16 +305,20 @@ static int pin_capsule_socket(const char *capsule, const char *suffix, uid_t *re return TAKE_FD(inode_fd); } -int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) { - _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL; +static int bus_set_address_capsule(sd_bus *bus, const char *capsule, const char *suffix, int *ret_pin_fd) { _cleanup_close_ int inode_fd = -EBADF; _cleanup_free_ char *pp = NULL; uid_t uid; gid_t gid; int r; + assert(bus); assert(capsule); - assert(ret_bus); + assert(suffix); + assert(ret_pin_fd); + + /* Connects to a capsule's user bus. We need to do so under the capsule's UID/GID, otherwise + * the service manager might refuse our connection. Hence fake it. */ r = capsule_name_is_valid(capsule); if (r < 0) @@ -320,10 +326,7 @@ int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) { if (r == 0) return -EINVAL; - /* Connects to a capsule's user bus. We need to do so under the capsule's UID/GID, otherwise the - * the service manager might refuse our connection. Hence fake it. */ - - inode_fd = pin_capsule_socket(capsule, "systemd/private", &uid, &gid); + inode_fd = pin_capsule_socket(capsule, suffix, &uid, &gid); if (inode_fd < 0) return inode_fd; @@ -331,50 +334,38 @@ int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) { if (!pp) return -ENOMEM; - r = sd_bus_new(&bus); - if (r < 0) - return r; - if (asprintf(&bus->address, "unix:path=%s,uid=" UID_FMT ",gid=" GID_FMT, pp, uid, gid) < 0) return -ENOMEM; - r = sd_bus_start(bus); - if (r < 0) - return r; - - *ret_bus = TAKE_PTR(bus); + *ret_pin_fd = TAKE_FD(inode_fd); /* This fd must be kept pinned until the connection has been established */ return 0; } int bus_set_address_capsule_bus(sd_bus *bus, const char *capsule, int *ret_pin_fd) { - _cleanup_free_ char *pp = NULL; + return bus_set_address_capsule(bus, capsule, "bus", ret_pin_fd); +} + +int bus_connect_capsule_systemd(const char *capsule, sd_bus **ret_bus) { + _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL; _cleanup_close_ int inode_fd = -EBADF; - uid_t uid; - gid_t gid; int r; - assert(bus); assert(capsule); - assert(ret_pin_fd); + assert(ret_bus); - r = capsule_name_is_valid(capsule); + r = sd_bus_new(&bus); if (r < 0) return r; - if (r == 0) - return -EINVAL; - - inode_fd = pin_capsule_socket(capsule, "bus", &uid, &gid); - if (inode_fd < 0) - return inode_fd; - pp = bus_address_escape(FORMAT_PROC_FD_PATH(inode_fd)); - if (!pp) - return -ENOMEM; + r = bus_set_address_capsule(bus, capsule, "systemd/private", &inode_fd); + if (r < 0) + return r; - if (asprintf(&bus->address, "unix:path=%s,uid=" UID_FMT ",gid=" GID_FMT, pp, uid, gid) < 0) - return -ENOMEM; + r = sd_bus_start(bus); + if (r < 0) + return r; - *ret_pin_fd = TAKE_FD(inode_fd); /* This fd must be kept pinned until the connection has been established */ + *ret_bus = TAKE_PTR(bus); return 0; }