Blame SOURCES/cpio-2.13-reset-gid-uid.patch

808377
From 5913893d6f3de65b16e1ad294b88893305efb20f Mon Sep 17 00:00:00 2001
808377
From: Ondrej Dubaj <odubaj@redhat.com>
808377
Date: Thu, 18 Feb 2021 09:59:31 +0100
808377
Subject: [PATCH] * lib/system.h (ERRNO_IS_EACCES): Remove.  Not used anymore.
808377
 (sys_reset_uid_gid): Re-initialize supplementary groups when switching
808377
 privileges. Fix ordering of setgid and setuid calls.
808377
808377
---
808377
 lib/system.h | 32 +++++++++++++++++++++++++-------
808377
 1 file changed, 25 insertions(+), 7 deletions(-)
808377
808377
diff --git a/lib/system.h b/lib/system.h
808377
index 1c1a5d0..4fd3ce9 100644
808377
--- a/lib/system.h
808377
+++ b/lib/system.h
808377
@@ -470,19 +470,37 @@ char *getenv ();
808377
 #if MSDOS
808377
 # include <process.h>
808377
 # define SET_BINARY_MODE(arc) setmode(arc, O_BINARY)
808377
-# define ERRNO_IS_EACCES errno == EACCES
808377
 # define mkdir(file, mode) (mkdir) (file)
808377
 # define TTY_NAME "con"
808377
 # define sys_reset_uid_gid()
808377
 #else
808377
 # define SET_BINARY_MODE(arc)
808377
-# define ERRNO_IS_EACCES 0
808377
 # define TTY_NAME "/dev/tty"
808377
-# define sys_reset_uid_gid()					\
808377
-  do {								\
808377
-    if (! (setuid (getuid ()) == 0 && setgid (getgid ()) == 0)) \
808377
-      abort ();							\
808377
-  } while (0)
808377
+# include <paxlib.h>
808377
+static inline void
808377
+sys_reset_uid_gid (void)
808377
+{
808377
+  struct passwd *pw;
808377
+  uid_t uid = getuid ();
808377
+  gid_t gid = getgid ();
808377
+  
808377
+  if ((pw = getpwuid (uid)) == NULL)
808377
+    {
808377
+      FATAL_ERROR ((0, errno, "%s(%lu)", "getpwuid", (unsigned long)uid));
808377
+    }
808377
+  if (initgroups (pw->pw_name, getgid ()))
808377
+    {
808377
+      FATAL_ERROR ((0, errno, "%s", "initgroups"));
808377
+    }
808377
+  if (gid != getegid () && setgid (gid) && errno != EPERM)
808377
+    {
808377
+      FATAL_ERROR ((0, errno, "%s", "setgid"));
808377
+    }
808377
+  if (uid != geteuid () && setuid (uid) && errno != EPERM)
808377
+    {
808377
+      FATAL_ERROR ((0, errno, "%s", "setuid"));
808377
+    }
808377
+}
808377
 #endif
808377
 
808377
 #if XENIX
808377
-- 
808377
2.26.0
808377