libbb: Add xsetegid(), xseteuid(), xopen_as_uid_gid() functions

Signed-off-by: Ryan Mallon <rmallon@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Ryan Mallon 2013-10-08 14:52:49 +02:00 committed by Denys Vlasenko
parent 932e233a49
commit 5906a5c26c
2 changed files with 42 additions and 12 deletions

View File

@ -461,6 +461,8 @@ void record_signo(int signo); /* not FAST_FUNC! */
void xsetgid(gid_t gid) FAST_FUNC;
void xsetuid(uid_t uid) FAST_FUNC;
void xsetegid(gid_t egid) FAST_FUNC;
void xseteuid(uid_t euid) FAST_FUNC;
void xchdir(const char *path) FAST_FUNC;
void xchroot(const char *path) FAST_FUNC;
void xsetenv(const char *key, const char *value) FAST_FUNC;
@ -469,11 +471,12 @@ void bb_unsetenv_and_free(char *key) FAST_FUNC;
void xunlink(const char *pathname) FAST_FUNC;
void xstat(const char *pathname, struct stat *buf) FAST_FUNC;
void xfstat(int fd, struct stat *buf, const char *errmsg) FAST_FUNC;
int open3_or_warn(const char *pathname, int flags, int mode) FAST_FUNC;
int open_or_warn(const char *pathname, int flags) FAST_FUNC;
int xopen3(const char *pathname, int flags, int mode) FAST_FUNC;
int xopen(const char *pathname, int flags) FAST_FUNC;
int xopen_nonblocking(const char *pathname) FAST_FUNC;
int xopen3(const char *pathname, int flags, int mode) FAST_FUNC;
int open_or_warn(const char *pathname, int flags) FAST_FUNC;
int open3_or_warn(const char *pathname, int flags, int mode) FAST_FUNC;
int xopen_as_uid_gid(const char *pathname, int flags, uid_t u, gid_t g) FAST_FUNC;
int open_or_warn_stdin(const char *pathname) FAST_FUNC;
int xopen_stdin(const char *pathname) FAST_FUNC;
void xrename(const char *oldpath, const char *newpath) FAST_FUNC;

View File

@ -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)
{