more crond+crontab integrating with loginutil libbb functions and deleted
authorGlenn L McGrath <bug1@ihug.co.nz>
Wed, 3 Sep 2003 12:18:42 +0000 (12:18 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Wed, 3 Sep 2003 12:18:42 +0000 (12:18 -0000)
patch from Thomas Gleixner to init.
Viodz last_patch_108

include/libbb.h
init/init.c
libbb/change_identity.c
miscutils/crond.c
miscutils/crontab.c

index 64903732db4afde343fee95ee5dcc8ef4c1226e8..4bfcc7a8b1b6b6aec5e69a5f9275f1b5a4314714 100644 (file)
@@ -411,6 +411,7 @@ void bb_xasprintf(char **string_ptr, const char *format, ...) __attribute__ ((fo
 
 #define FAIL_DELAY    3
 extern void change_identity ( const struct passwd *pw );
+extern const char *change_identity_e2str ( const struct passwd *pw );
 extern void run_shell ( const char *shell, int loginshell, const char *command, const char **additional_args
 #ifdef CONFIG_SELINUX
        , security_id_t sid
index 2f44e13bf6b5634cf2d04b4607f1bbb62406b12d..26bbc3428764995e8a3d460f87beb984d1002d1a 100644 (file)
@@ -829,13 +829,6 @@ static void cont_handler(int sig)
        got_cont = 1;
 }
 
-/* Reap any zombie processes that are reparented to init */
-static void child_handler(int sig)
-{
-       int status;
-       while ( wait3(&status, WNOHANG, NULL) > 0 );
-}
-
 #endif                                                 /* ! DEBUG_INIT */
 
 static void new_init_action(int action, const char *command, const char *cons)
@@ -1076,7 +1069,6 @@ extern int init_main(int argc, char **argv)
        signal(SIGCONT, cont_handler);
        signal(SIGSTOP, stop_handler);
        signal(SIGTSTP, stop_handler);
-       signal(SIGCHLD, child_handler);
 
        /* Turn off rebooting via CTL-ALT-DEL -- we get a 
         * SIGINT on CAD so we can shut things down gracefully... */
index c2b73eeb8bc56621e61331bf4f65094a9fbb3546..adebad8ed280bd9f6cfb141c3cdfbdaf4067f816 100644 (file)
 
 
 /* Become the user and group(s) specified by PW.  */
-void change_identity ( const struct passwd *pw )
+const char *change_identity_e2str ( const struct passwd *pw )
 {
        if ( initgroups ( pw-> pw_name, pw-> pw_gid ) == -1 )
-               bb_perror_msg_and_die ( "cannot set groups" );
+               return "cannot set groups";
        endgrent ( );
 
        if ( setgid ( pw-> pw_gid ))
-               bb_perror_msg_and_die ( "cannot set group id" );
+               return "cannot set group id";
        if ( setuid ( pw->pw_uid ))
-               bb_perror_msg_and_die ( "cannot set user id" );
+               return "cannot set user id";
+       return NULL;
 }
 
+void change_identity ( const struct passwd *pw )
+{
+       const char *err_msg = change_identity_e2str(pw);
+
+       if(err_msg)
+               bb_perror_msg_and_die ( "%s", err_msg );
+}
index 637e09dd8371df4a5455ccbf8a5018ae86e00e62..7915b860ac4ede6a76b66ecc5fe349bef63f1745 100644 (file)
@@ -299,6 +299,7 @@ static int
 ChangeUser(const char *user)
 {
     struct passwd *pas;
+    const char *err_msg;
 
     /*
      * Obtain password entry and change privilages
@@ -315,18 +316,9 @@ ChangeUser(const char *user)
     /*
      * Change running state to the user in question
      */
-
-    if (initgroups(user, pas->pw_gid) < 0) {
-       crondlog("\011initgroups failed: %s %m", user);
-       return(-1);
-    }
-    /* drop all priviledges */
-    if (setgid(pas->pw_gid) < 0) {
-       crondlog("\011setgid failed: %s %d", user, pas->pw_gid);
-       return(-1);
-    }
-    if (setuid(pas->pw_uid) < 0) {
-       crondlog("\011setuid failed: %s %d", user, pas->pw_uid);
+    err_msg = change_identity_e2str(pas);
+    if (err_msg) {
+       crondlog("\011%s for user %s", err_msg, user);
        return(-1);
     }
        if (chdir(pas->pw_dir) < 0) {
index 6c4da95fea9e62fc78574284a565da466e2c8002..52d08dda3a5de5fca494f4be3003137d76a8b302 100644 (file)
@@ -333,18 +333,6 @@ EditFile(const char *user, const char *file)
     wait4(pid, NULL, 0, NULL);
 }
 
-static void
-log(const char *ctl, ...)
-{
-    va_list va;
-    char buf[1024];
-
-    va_start(va, ctl);
-    vsnprintf(buf, sizeof(buf), ctl, va);
-    syslog(LOG_NOTICE, "%s",buf );
-    va_end(va);
-}
-
 static int
 ChangeUser(const char *user, short dochdir)
 {
@@ -355,7 +343,7 @@ ChangeUser(const char *user, short dochdir)
      */
 
     if ((pas = getpwnam(user)) == 0) {
-       log("failed to get uid for %s", user);
+       bb_perror_msg_and_die("failed to get uid for %s", user);
        return(-1);
     }
     setenv("USER", pas->pw_name, 1);
@@ -365,24 +353,13 @@ ChangeUser(const char *user, short dochdir)
     /*
      * Change running state to the user in question
      */
+    change_identity(pas);
 
-    if (initgroups(user, pas->pw_gid) < 0) {
-       log("initgroups failed: %s %m", user);
-       return(-1);
-    }
-    if (setregid(pas->pw_gid, pas->pw_gid) < 0) {
-       log("setregid failed: %s %d", user, pas->pw_gid);
-       return(-1);
-    }
-    if (setreuid(pas->pw_uid, pas->pw_uid) < 0) {
-       log("setreuid failed: %s %d", user, pas->pw_uid);
-       return(-1);
-    }
     if (dochdir) {
        if (chdir(pas->pw_dir) < 0) {
+           bb_perror_msg_and_die("chdir failed: %s %s", user, pas->pw_dir);
            if (chdir(TMPDIR) < 0) {
-               log("chdir failed: %s %s", user, pas->pw_dir);
-               log("chdir failed: %s " TMPDIR, user);
+               bb_perror_msg_and_die("chdir failed: %s %s", user, TMPDIR);
                return(-1);
            }
        }