]> err.no Git - dpkg/commitdiff
s-s-d: Properly set the supplementary groups on --chuid
authorGuillem Jover <guillem@debian.org>
Tue, 22 Jan 2008 19:20:49 +0000 (21:20 +0200)
committerGuillem Jover <guillem@debian.org>
Tue, 22 Jan 2008 19:28:12 +0000 (21:28 +0200)
Set the supplementary groups if the real user or group are different than
the ones we should switch to.

Closes: #462075
ChangeLog
debian/changelog
utils/start-stop-daemon.c

index c7f8e284ff48f270a1dc5af57ca899f9d45055fb..245df37c0403b96870cdeb183e53198785c2b313 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-01-22  Guillem Jover  <guillem@debian.org>
+
+       * utils/start-stop-daemon.c (gid_in_current_groups): Remove function.
+       (main): Call initgroups if the real user or group are different than
+       the ones we should switch to. Call setgid before initgroups.
+
 2008-01-22  Raphael Hertzog  <hertzog@debian.org>
 
        * scripts/dpkg-genchanges.pl, scripts/dpkg-gencontrol.pl,
index d9e897c6134d07a8a953375d4f571d958aa40e05..dbea147a7bfa577fd67669a15562c2fa5da95d3d 100644 (file)
@@ -1,9 +1,14 @@
 dpkg (1.14.16.3) UNRELEASED; urgency=low
 
+  [ Raphael Hertzog ]
   * Remove the ":utf8" layer that utf8-encodes already valid utf8.
     Closes: #462098
   * Disable variable substitution in dpkg-genchanges. Closes: #462079, #462089
 
+  [ Guillem Jover ]
+  * Make start-stop-daemon set the supplementary groups if the real user or
+    group are different than the ones we should switch to. Closes: #462075
+
  -- Raphael Hertzog <hertzog@debian.org>  Tue, 22 Jan 2008 18:15:42 +0100
 
 dpkg (1.14.16.2) unstable; urgency=low
index 2a31f73073c981eb1943b8e2f78b41c2c208f55f..a59e24095ed510facc14dcc92737f7fde1093eaa 100644 (file)
@@ -322,27 +322,6 @@ clear(struct pid_list **list)
        *list = NULL;
 }
 
-static int
-gid_in_current_groups(gid_t gid)
-{
-       gid_t *gids;
-       int i, ngroups;
-
-       ngroups = getgroups(0, NULL);
-       gids = xmalloc(ngroups * sizeof(gid_t));
-       getgroups(ngroups, gids);
-
-       for (i = 0; i < ngroups; i++) {
-               if (gid == gids[i]) {
-                       free(gids);
-                       return 1;
-               }
-       }
-
-       free(gids);
-       return 0;
-}
-
 static void
 do_help(void)
 {
@@ -1285,6 +1264,8 @@ int
 main(int argc, char **argv)
 {
        int devnull_fd = -1;
+       gid_t rgid;
+       uid_t ruid;
 #ifdef HAVE_TIOCNOTTY
        int tty_fd = -1;
 #endif
@@ -1413,18 +1394,25 @@ main(int argc, char **argv)
        if (chdir(changedir) < 0)
                fatal("Unable to chdir() to %s", changedir);
 
-       if (changegroup != NULL && *changegroup != '\0' &&
-           getgid() != (gid_t)runas_gid) {
-               if (!gid_in_current_groups(runas_gid))
+       rgid = getgid();
+       ruid = getuid();
+       if (changegroup != NULL) {
+               if (rgid != (gid_t)runas_gid)
+                       if (setgid(runas_gid))
+                               fatal("Unable to set gid to %d", runas_gid);
+
+               /* We assume that if our real user and group are the same as
+                * the ones we should switch to, the supplementary groups
+                * will be already in place. */
+               if (rgid != (gid_t)runas_gid || ruid != (uid_t)runas_uid)
                        if (initgroups(changeuser, runas_gid))
                                fatal("Unable to set initgroups() with gid %d",
                                      runas_gid);
-               if (setgid(runas_gid))
-                       fatal("Unable to set gid to %d", runas_gid);
        }
-       if (changeuser != NULL && getuid() != (uid_t)runas_uid) {
-               if (setuid(runas_uid))
-                       fatal("Unable to set uid to %s", changeuser);
+       if (changeuser != NULL) {
+               if (ruid != (uid_t)runas_uid)
+                       if (setuid(runas_uid))
+                               fatal("Unable to set uid to %s", changeuser);
        }
 
        if (background) {