more crond+crontab integrating with loginutil libbb functions and deleted patch from Thomas Gleixner to init. Viodz last_patch_108
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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... */ | |
| @@ -40,15 +40,23 @@ | |
| /* 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 ); |
| + | } |
| @@ -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) { | |
| @@ -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); | |
| } | |
| } | |