commit af3a75b4d0291f7b154153de76a7855682692b95 from: Omar Polo date: Fri Dec 02 11:57:37 2022 UTC add tests and compat for setresuid and setresgid backport of bd8683d0fd36893c18e7271faaa3b9ea67df0695 commit - 4fbd4dcc6ee14dc6b739f804cda650725b33c50a commit + af3a75b4d0291f7b154153de76a7855682692b95 blob - 57db3ea9173c4ec7029eb9254a4ca83a86fb0abb blob + e98fdd63230325eff50534ebe082ae92e7611884 --- compat/Makefile +++ compat/Makefile @@ -13,6 +13,8 @@ DISTFILES = Makefile \ reallocarray.c \ recallocarray.c \ setproctitle.c \ + setresgid.c \ + setresuid.c \ strlcat.c \ strlcpy.c \ strtonum.c \ blob - /dev/null blob + ec625cd0abbff37a6be1700a1cd73e0f67bd2079 (mode 644) --- /dev/null +++ compat/setresgid.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2004, 2005 Darren Tucker (dtucker at zip com au). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +int +setresgid(gid_t rgid, gid_t egid, gid_t sgid) +{ + /* this is the only configuration tested */ + + if (rgid != egid || egid != sgid) + return -1; + + if (setregid(rgid, egid) == -1) + return -1; + + return 0; +} blob - /dev/null blob + a033d99ab249e10501c2f99de973d2d3242757f8 (mode 644) --- /dev/null +++ compat/setresuid.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2004, 2005 Darren Tucker (dtucker at zip com au). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include + +int +setresuid(uid_t ruid, uid_t euid, uid_t suid) +{ + uid_t ouid; + int ret = -1; + + /* Allow only the tested configuration. */ + + if (ruid != euid || euid != suid) { + errno = ENOSYS; + return -1; + } + ouid = getuid(); + + if ((ret = setreuid(euid, euid)) == -1) + return -1; + + /* + * When real, effective and saved uids are the same and we have + * changed uids, sanity check that we cannot restore the old uid. + */ + + if (ruid == euid && euid == suid && ouid != ruid && + setuid(ouid) != -1 && seteuid(ouid) != -1) { + errno = EINVAL; + return -1; + } + + /* + * Finally, check that the real and effective uids are what we + * expect. + */ + if (getuid() != ruid || geteuid() != euid) { + errno = EACCES; + return -1; + } + + return ret; +} blob - bcc8e9d7a663e544e05b1f1d694288d73c2c96d4 blob + bbc2a5ca3fd0c6e2af8a1ba1001a8ebadd64cc34 --- configure +++ configure @@ -258,6 +258,8 @@ runtest queue_h QUEUE_H || true runtest reallocarray REALLOCARRAY || true runtest recallocarray RECALLOCARRAY || true runtest setproctitle SETPROCTITLE || true +runtest setresgid SETRESGID "" -D_GNU_SOURCE || true +runtest setresuid SETRESUID "" -D_GNU_SOURCE || true runtest strlcat STRLCAT || true runtest strlcpy STRLCPY || true runtest strtonum STRTONUM || true @@ -342,6 +344,8 @@ cat <<__HEREDOC__ #define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY} #define HAVE_RECALLOCARRAY ${HAVE_RECALLOCARRAY} #define HAVE_SETPROCTITLE ${HAVE_SETPROCTITLE} +#define HAVE_SETRESGID ${HAVE_SETRESGID} +#define HAVE_SETRESUID ${HAVE_SETRESUID} #define HAVE_STRLCAT ${HAVE_STRLCAT} #define HAVE_STRLCPY ${HAVE_STRLCPY} #define HAVE_STRTONUM ${HAVE_STRTONUM} @@ -358,6 +362,9 @@ __HEREDOC__ ${HAVE_STRLCPY} -eq 0 -o \ ${HAVE_STRTONUM} -eq 0 ] && echo "#include " +[ ${HAVE_SETRESGID} -eq 0 -o \ + ${HAVE_SETRESUID} -eq 0 ] && echo "#include " + if [ ${HAVE_ERR} -eq 0 ]; then echo "extern void err(int, const char*, ...);" echo "extern void errx(int, const char*, ...);" @@ -406,6 +413,14 @@ if [ ${HAVE_SETPROCTITLE} -eq 0 ]; then echo "extern void setproctitle(const char *fmt, ...);" COBJS="${COBJS} compat/setproctitle.o" fi +if [ ${HAVE_SETRESGID} -eq 0 ]; then + echo "extern int setresgid(gid_t, gid_t, gid_t);" + COBJS="${COBJS} compat/setresgid.o" +fi +if [ ${HAVE_SETRESUID} -eq 0 ]; then + echo "extern int setresuid(uid_t, uid_t, uid_t);" + COBJS="${COBJS} compat/setresuid.o" +fi if [ ${HAVE_STRLCAT} -eq 0 ]; then echo "extern size_t strlcat(char*, const char*, size_t);" COBJS="${COBJS} compat/strlcat.o" blob - 4ac7158746c6a4955396c415595f6366040312d9 blob + 3aa1b977103ed04c72d3f3c7c84f2dbfc9beb2c9 --- have/Makefile +++ have/Makefile @@ -19,6 +19,8 @@ DISTFILES = Makefile \ reallocarray.c \ recallocarray.c \ setproctitle.c \ + setresgid.c \ + setresuid.c \ strlcat.c \ strlcpy.c \ strtonum.c \ blob - /dev/null blob + 616458f82280192cdb500175616ed252dfe19928 (mode 644) --- /dev/null +++ have/setresgid.c @@ -0,0 +1,8 @@ +#include +#include + +int +main(void) +{ + return setresgid(-1, -1, -1) == -1; +} blob - /dev/null blob + 0f3f65c864ef1d839583399c33676500daf4c72a (mode 644) --- /dev/null +++ have/setresuid.c @@ -0,0 +1,8 @@ +#include +#include + +int +main(void) +{ + return setresuid(-1, -1, -1) == -1; +}