libbb: Add xsetegid(), xseteuid(), xopen_as_uid_gid() functions
No binary (build failed)
—
(log yok)
| @@ -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) | |
| { | |