setid.diff   [plain text]


--- /SourceCache/bash/bash-73/bash/shell.c	2007-03-16 19:26:03.000000000 -0700
+++ ./shell.c	2007-05-18 15:47:47.000000000 -0700
@@ -478,6 +478,14 @@ main (argc, argv, env)
 #ifdef __APPLE__
   if (running_setuid && privileged_mode == 0 && (tiger_mode ? (act_like_sh == 0) : 1))
     disable_priv_mode ();
+  else if (running_setuid && privileged_mode != 0) {
+    uid_t euid = geteuid();
+    uid_t ruid = getuid();
+    if (-1 == setuid(euid))
+      internal_error( _("setuid(%u) failed: %s"), euid, strerror(errno));
+    if (-1 == setreuid(ruid, euid))
+      internal_error( _("setreuid(%u,%u) failed: %s"), ruid, euid, strerror(errno));   
+  }
 #else  /* !__APPLE__ */
   if (running_setuid && privileged_mode == 0)
     disable_priv_mode ();