utils: improve lxc_switch_uid_gid()

parent b962868f
...@@ -1353,19 +1353,27 @@ int lxc_preserve_ns(const int pid, const char *ns) ...@@ -1353,19 +1353,27 @@ int lxc_preserve_ns(const int pid, const char *ns)
int lxc_switch_uid_gid(uid_t uid, gid_t gid) int lxc_switch_uid_gid(uid_t uid, gid_t gid)
{ {
if (setgid(gid) < 0) { int ret = 0;
SYSERROR("Failed to switch to gid %d.", gid);
return -errno; if (gid != LXC_INVALID_GID) {
ret = setgid(gid);
if (ret < 0) {
SYSERROR("Failed to switch to gid %d", gid);
return -1;
}
NOTICE("Switched to gid %d", gid);
} }
NOTICE("Switched to gid %d.", gid);
if (setuid(uid) < 0) { if (uid != LXC_INVALID_UID) {
SYSERROR("Failed to switch to uid %d.", uid); ret = setuid(uid);
return -errno; if (ret < 0) {
SYSERROR("Failed to switch to uid %d", uid);
return -1;
}
NOTICE("Switched to uid %d", uid);
} }
NOTICE("Switched to uid %d.", uid);
return 0; return ret;
} }
/* Simple covenience function which enables uniform logging. */ /* Simple covenience function which enables uniform logging. */
......
...@@ -358,7 +358,9 @@ extern int lxc_preserve_ns(const int pid, const char *ns); ...@@ -358,7 +358,9 @@ extern int lxc_preserve_ns(const int pid, const char *ns);
/* Check whether a signal is blocked by a process. */ /* Check whether a signal is blocked by a process. */
extern bool task_blocks_signal(pid_t pid, int signal); extern bool task_blocks_signal(pid_t pid, int signal);
/* Switch to a new uid and gid. */ /* Switch to a new uid and gid.
* If LXC_INVALID_{G,U}ID is passed then the set{g,u}id() will not be called.
*/
extern int lxc_switch_uid_gid(uid_t uid, gid_t gid); extern int lxc_switch_uid_gid(uid_t uid, gid_t gid);
extern int lxc_setgroups(int size, gid_t list[]); extern int lxc_setgroups(int size, gid_t list[]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment