aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-04-13 06:43:00 +0000
committerRoy Marples <roy@marples.name>2007-04-13 06:43:00 +0000
commit824e9577e76df03c2572853d6ac15b10a27c9ace (patch)
treee360416bdc0aaf4e9725ebe2649226a953bb469f
parent1f7770af7bae7d04824752ad055e274e66de53f8 (diff)
Fix module loading, #174360. s-s-d now changes group when changing user, #174362.
-rw-r--r--ChangeLog7
-rw-r--r--src/start-stop-daemon.c57
2 files changed, 40 insertions, 24 deletions
diff --git a/ChangeLog b/ChangeLog
index e0207bb7..7e52ec02 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,11 +1,16 @@
# ChangeLog for Gentoo System Intialization ("rc") scripts
# Copyright 1999-2007 Gentoo Foundation; Distributed under the GPLv2
+ 13 Apr 2007; Roy Marples <uberlord@gentoo.org>:
+
+ Fix module loading, #174360.
+ s-s-d now changes group when changing user, #174362.
+
* baselayout-2.0.0_alpha1 (11 Apr 2007)
07 Apr 2007; Mike Frysinger <vapier@gentoo.org>:
- "modules-update" -> "update-modules".
+ "modules-update" -> "update-modules".
05 Apr 2007; Roy Marples <uberlord@gentoo.org>:
diff --git a/src/start-stop-daemon.c b/src/start-stop-daemon.c
index 384b72c6..ef4fac03 100644
--- a/src/start-stop-daemon.c
+++ b/src/start-stop-daemon.c
@@ -562,28 +562,35 @@ int main (int argc, char **argv)
break;
case 'c': /* --chuid <username>|<uid> */
- /* we copy the string just in case we need the
- * argument later. */
{
char *p = optarg;
char *cu = strsep (&p, ":");
+ struct passwd *pw = NULL;
+
changeuser = strdup (cu);
- if (sscanf (cu, "%d", &tid) != 1) {
- struct passwd *pw = getpwnam (cu);
- if (! pw)
- eerrorx ("%s: user `%s' not found", progname, cu);
- ch_uid = pw->pw_uid;
- } else
- ch_uid = tid;
+ if (sscanf (cu, "%d", &tid) != 1)
+ pw = getpwnam (cu);
+ else
+ pw = getpwuid (tid);
+
+ if (! pw)
+ eerrorx ("%s: user `%s' not found", progname, cu);
+ ch_uid = pw->pw_uid;
+ if (! ch_gid)
+ ch_gid = pw->pw_gid;
+
if (p) {
+ struct group *gr = NULL;
char *cg = strsep (&p, ":");
- if (sscanf (cg, "%d", &tid) != 1) {
- struct group *gr = getgrnam (cg);
- if (! gr)
- eerrorx ("%s: group `%s' not found", progname, cg);
- ch_gid = gr->gr_gid;
- } else
- ch_gid = tid;
+
+ if (sscanf (cg, "%d", &tid) != 1)
+ gr = getgrnam (cg);
+ else
+ gr = getgrgid (tid);
+
+ if (! gr)
+ eerrorx ("%s: group `%s' not found", progname, cg);
+ ch_gid = gr->gr_gid;
}
}
break;
@@ -593,13 +600,18 @@ int main (int argc, char **argv)
break;
case 'g': /* --group <group>|<gid> */
- if (sscanf (optarg, "%d", &tid) != 1) {
+ {
struct group *gr = getgrnam (optarg);
+
+ if (sscanf (optarg, "%d", &tid) != 1)
+ gr = getgrnam (optarg);
+ else
+ gr = getgrgid (tid);
+
if (! gr)
eerrorx ("%s: group `%s' not found", progname, optarg);
ch_gid = gr->gr_gid;
- } else
- ch_gid = tid;
+ }
break;
case 'm': /* --make-pidfile */
@@ -821,11 +833,10 @@ int main (int argc, char **argv)
eerrorx ("%s: pam error: %s", progname, pam_strerror(pamh, pamr));
#endif
- if ((ch_gid) && setgid(ch_gid))
+ if (ch_gid && setgid (ch_gid))
eerrorx ("%s: unable to set groupid to %d", progname, ch_gid);
- if (changeuser && ch_gid)
- if (initgroups (changeuser, ch_gid))
- eerrorx ("%s: initgroups (%s, %d)", progname, changeuser, ch_gid);
+ if (changeuser && initgroups (changeuser, ch_gid))
+ eerrorx ("%s: initgroups (%s, %d)", progname, changeuser, ch_gid);
if (ch_uid && setuid (ch_uid))
eerrorx ("%s: unable to set userid to %d", progname, ch_uid);
else {