From 5906a5c26c392b9687d14951a6da3a5195b576be Mon Sep 17 00:00:00 2001 From: Ryan Mallon Date: Tue, 8 Oct 2013 14:52:49 +0200 Subject: libbb: Add xsetegid(), xseteuid(), xopen_as_uid_gid() functions Signed-off-by: Ryan Mallon Signed-off-by: Denys Vlasenko --- libbb/xfuncs_printf.c | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) (limited to 'libbb/xfuncs_printf.c') diff --git a/libbb/xfuncs_printf.c b/libbb/xfuncs_printf.c index a70683241..e4ac6a002 100644 --- a/libbb/xfuncs_printf.c +++ b/libbb/xfuncs_printf.c @@ -140,15 +140,6 @@ int FAST_FUNC xopen(const char *pathname, int flags) return xopen3(pathname, flags, 0666); } -/* Die if we can't open an existing file readonly with O_NONBLOCK - * and return the fd. - * Note that for ioctl O_RDONLY is sufficient. - */ -int FAST_FUNC xopen_nonblocking(const char *pathname) -{ - return xopen(pathname, O_RDONLY | O_NONBLOCK); -} - // Warn if we can't open a file and return a fd. int FAST_FUNC open3_or_warn(const char *pathname, int flags, int mode) { @@ -167,6 +158,32 @@ int FAST_FUNC open_or_warn(const char *pathname, int flags) return open3_or_warn(pathname, flags, 0666); } +/* Die if we can't open an existing file readonly with O_NONBLOCK + * and return the fd. + * Note that for ioctl O_RDONLY is sufficient. + */ +int FAST_FUNC xopen_nonblocking(const char *pathname) +{ + return xopen(pathname, O_RDONLY | O_NONBLOCK); +} + +int FAST_FUNC xopen_as_uid_gid(const char *pathname, int flags, uid_t u, gid_t g) +{ + int fd; + uid_t old_euid = geteuid(); + gid_t old_egid = getegid(); + + xsetegid(g); + xseteuid(u); + + fd = xopen(pathname, flags); + + xseteuid(old_euid); + xsetegid(old_egid); + + return fd; +} + void FAST_FUNC xunlink(const char *pathname) { if (unlink(pathname)) @@ -351,6 +368,16 @@ void FAST_FUNC xsetuid(uid_t uid) if (setuid(uid)) bb_perror_msg_and_die("setuid"); } +void FAST_FUNC xsetegid(gid_t egid) +{ + if (setegid(egid)) bb_perror_msg_and_die("setegid"); +} + +void FAST_FUNC xseteuid(uid_t euid) +{ + if (seteuid(euid)) bb_perror_msg_and_die("seteuid"); +} + // Die if we can't chdir to a new path. void FAST_FUNC xchdir(const char *path) { -- cgit v1.2.3