]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
chroot: set-*-ID failure must provoke nonzero exit before execvp
authorJim Meyering <meyering@redhat.com>
Wed, 27 May 2009 20:06:04 +0000 (22:06 +0200)
committerJim Meyering <meyering@redhat.com>
Tue, 2 Jun 2009 14:34:53 +0000 (16:34 +0200)
* src/chroot.c (main): Exit upon set-group-ID or set-user-ID failure.

src/chroot.c

index 788a1fc416c0255aa3a72811ab79625a6e2aaaa8..dccddd72285d0dbaac4a3fb70713be0e879baec3 100644 (file)
@@ -207,6 +207,7 @@ main (int argc, char **argv)
       char *user;
       char *group;
       char const *err = parse_user_spec (userspec, &uid, &gid, &user, &group);
+      bool fail = false;
 
       if (err)
         error (EXIT_FAILURE, errno, "%s", err);
@@ -214,14 +215,28 @@ main (int argc, char **argv)
       free (user);
       free (group);
 
+      /* Attempt to set all three: supplementary groups, group ID, user ID.
+         Diagnose any failures.  If any have failed, exit before execvp.  */
       if (groups && set_additional_groups (groups))
-        error (0, errno, _("failed to set additional groups"));
+        {
+          error (0, errno, _("failed to set additional groups"));
+          fail = true;
+        }
 
       if (gid && setgid (gid))
-        error (0, errno, _("failed to set group-ID"));
+        {
+          error (0, errno, _("failed to set group-ID"));
+          fail = true;
+        }
 
       if (uid && setuid (uid))
-        error (0, errno, _("failed to set user-ID"));
+        {
+          error (0, errno, _("failed to set user-ID"));
+          fail = true;
+        }
+
+      if (fail)
+        exit (EXIT_FAILURE);
     }
 
   /* Execute the given command.  */