aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libbb.h1
-rw-r--r--init/init.c8
-rw-r--r--libbb/change_identity.c16
-rw-r--r--miscutils/crond.c16
-rw-r--r--miscutils/crontab.c31
5 files changed, 21 insertions, 51 deletions
diff --git a/include/libbb.h b/include/libbb.h
index 64903732d..4bfcc7a8b 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -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
diff --git a/init/init.c b/init/init.c
index 2f44e13bf..26bbc3428 100644
--- a/init/init.c
+++ b/init/init.c
@@ -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... */
diff --git a/libbb/change_identity.c b/libbb/change_identity.c
index c2b73eeb8..adebad8ed 100644
--- a/libbb/change_identity.c
+++ b/libbb/change_identity.c
@@ -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 );
+}
diff --git a/miscutils/crond.c b/miscutils/crond.c
index 637e09dd8..7915b860a 100644
--- a/miscutils/crond.c
+++ b/miscutils/crond.c
@@ -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) {
diff --git a/miscutils/crontab.c b/miscutils/crontab.c
index 6c4da95fe..52d08dda3 100644
--- a/miscutils/crontab.c
+++ b/miscutils/crontab.c
@@ -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);
}
}