From fb018c25969e65d3caa784b87ec42da45ae0730c Mon Sep 17 00:00:00 2001 From: Robert Swiecki Date: Tue, 17 Oct 2017 15:16:27 +0200 Subject: [PATCH] user: use setresuid32 where available first (on some 32bit platforms: --- user.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/user.c b/user.c index 63cc684..a992c91 100644 --- a/user.c +++ b/user.c @@ -40,6 +40,38 @@ #include "subproc.h" #include "util.h" +static bool userSetResGid(gid_t gid) +{ + LOG_D("setresgid(%d)", gid); +#if defined(__NR_setresgid32) + if (syscall(__NR_setresgid32, (uintptr_t)gid, (uintptr_t)gid, (uintptr_t)gid) == -1 && errno != ENOSYS) { + PLOG_W("setresgid32(%d)", (int)gid); + return false; + } +#endif + if (syscall(__NR_setresgid, (uintptr_t)gid, (uintptr_t)gid, (uintptr_t)gid) == -1) { + PLOG_W("setresgid(%d)", gid); + return false; + } + return true; +} + +static bool userSetResUid(uid_t uid) +{ + LOG_D("setresuid(%d)", uid); +#if defined(__NR_setresuid32) + if (syscall(__NR_setresuid32, (uintptr_t)uid, (uintptr_t)uid, (uintptr_t)uid) == -1 && errno != ENOSYS) { + PLOG_W("setresuid32(%d)", (int)uid); + return false; + } +#endif + if (syscall(__NR_setresuid, (uintptr_t)uid, (uintptr_t)uid, (uintptr_t)uid) == -1) { + PLOG_W("setresuid(%d)", uid); + return false; + } + return true; +} + static bool userSetGroups(pid_t pid) { /* @@ -279,19 +311,11 @@ bool userInitNsFromChild(struct nsjconf_t* nsjconf) return false; } - LOG_D("setresgid(%d, %d, %d)", TAILQ_FIRST(&nsjconf->gids)->inside_id, - TAILQ_FIRST(&nsjconf->gids)->inside_id, TAILQ_FIRST(&nsjconf->gids)->inside_id); - if (syscall(__NR_setresgid, TAILQ_FIRST(&nsjconf->gids)->inside_id, - TAILQ_FIRST(&nsjconf->gids)->inside_id, TAILQ_FIRST(&nsjconf->gids)->inside_id) - == -1) { + if (!userSetResGid(TAILQ_FIRST(&nsjconf->gids)->inside_id)) { PLOG_E("setresgid(%u)", TAILQ_FIRST(&nsjconf->gids)->inside_id); return false; } - LOG_D("setresuid(%d, %d, %d)", TAILQ_FIRST(&nsjconf->uids)->inside_id, - TAILQ_FIRST(&nsjconf->uids)->inside_id, TAILQ_FIRST(&nsjconf->uids)->inside_id); - if (syscall(__NR_setresuid, TAILQ_FIRST(&nsjconf->uids)->inside_id, - TAILQ_FIRST(&nsjconf->uids)->inside_id, TAILQ_FIRST(&nsjconf->uids)->inside_id) - == -1) { + if (!userSetResUid(TAILQ_FIRST(&nsjconf->uids)->inside_id)) { PLOG_E("setresuid(%u)", TAILQ_FIRST(&nsjconf->uids)->inside_id); return false; }