Commit Diff


commit - 06035a023710962df95f48d8486739154a9d707a
commit + bd8683d0fd36893c18e7271faaa3b9ea67df0695
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 <sys/types.h>
+#include <unistd.h>
+
+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 <sys/types.h>
+
+#include <errno.h>
+#include <unistd.h>
+
+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 - 0127a011521fec7a0c7b004daa41c0652b1e43b5
blob + 55b6a99c2316b690ea13c91d4169fb0f7b19d3e6
--- 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
@@ -343,6 +345,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}
@@ -359,6 +363,9 @@ __HEREDOC__
   ${HAVE_STRLCPY} -eq 0 -o \
   ${HAVE_STRTONUM} -eq 0 ] && echo "#include <stddef.h>"
 
+[ ${HAVE_SETRESGID} -eq 0 -o \
+  ${HAVE_SETRESUID} -eq 0 ] && echo "#include <unistd.h>"
+
 if [ ${HAVE_ERR} -eq 0 ]; then
 	echo "extern	void	 err(int, const char*, ...);"
 	echo "extern	void	 errx(int, const char*, ...);"
@@ -407,6 +414,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 <sys/types.h>
+#include <unistd.h>
+
+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 <sys/types.h>
+#include <unistd.h>
+
+int
+main(void)
+{
+	return setresuid(-1, -1, -1) == -1;
+}