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:
parent
932e233a49
commit
5906a5c26c
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user