more crond+crontab integrating with loginutil libbb functions and deleted
patch from Thomas Gleixner to init. Viodz last_patch_108
This commit is contained in:
parent
759d7ececd
commit
99bd5adf99
@ -411,6 +411,7 @@ void bb_xasprintf(char **string_ptr, const char *format, ...) __attribute__ ((fo
|
|||||||
|
|
||||||
#define FAIL_DELAY 3
|
#define FAIL_DELAY 3
|
||||||
extern void change_identity ( const struct passwd *pw );
|
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
|
extern void run_shell ( const char *shell, int loginshell, const char *command, const char **additional_args
|
||||||
#ifdef CONFIG_SELINUX
|
#ifdef CONFIG_SELINUX
|
||||||
, security_id_t sid
|
, security_id_t sid
|
||||||
|
@ -829,13 +829,6 @@ static void cont_handler(int sig)
|
|||||||
got_cont = 1;
|
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 */
|
#endif /* ! DEBUG_INIT */
|
||||||
|
|
||||||
static void new_init_action(int action, const char *command, const char *cons)
|
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(SIGCONT, cont_handler);
|
||||||
signal(SIGSTOP, stop_handler);
|
signal(SIGSTOP, stop_handler);
|
||||||
signal(SIGTSTP, stop_handler);
|
signal(SIGTSTP, stop_handler);
|
||||||
signal(SIGCHLD, child_handler);
|
|
||||||
|
|
||||||
/* Turn off rebooting via CTL-ALT-DEL -- we get a
|
/* Turn off rebooting via CTL-ALT-DEL -- we get a
|
||||||
* SIGINT on CAD so we can shut things down gracefully... */
|
* SIGINT on CAD so we can shut things down gracefully... */
|
||||||
|
@ -40,15 +40,23 @@
|
|||||||
|
|
||||||
|
|
||||||
/* Become the user and group(s) specified by PW. */
|
/* 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 )
|
if ( initgroups ( pw-> pw_name, pw-> pw_gid ) == -1 )
|
||||||
bb_perror_msg_and_die ( "cannot set groups" );
|
return "cannot set groups";
|
||||||
endgrent ( );
|
endgrent ( );
|
||||||
|
|
||||||
if ( setgid ( pw-> pw_gid ))
|
if ( setgid ( pw-> pw_gid ))
|
||||||
bb_perror_msg_and_die ( "cannot set group id" );
|
return "cannot set group id";
|
||||||
if ( setuid ( pw->pw_uid ))
|
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)
|
ChangeUser(const char *user)
|
||||||
{
|
{
|
||||||
struct passwd *pas;
|
struct passwd *pas;
|
||||||
|
const char *err_msg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Obtain password entry and change privilages
|
* Obtain password entry and change privilages
|
||||||
@ -315,18 +316,9 @@ ChangeUser(const char *user)
|
|||||||
/*
|
/*
|
||||||
* Change running state to the user in question
|
* Change running state to the user in question
|
||||||
*/
|
*/
|
||||||
|
err_msg = change_identity_e2str(pas);
|
||||||
if (initgroups(user, pas->pw_gid) < 0) {
|
if (err_msg) {
|
||||||
crondlog("\011initgroups failed: %s %m", user);
|
crondlog("\011%s for user %s", err_msg, 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);
|
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
if (chdir(pas->pw_dir) < 0) {
|
if (chdir(pas->pw_dir) < 0) {
|
||||||
|
@ -333,18 +333,6 @@ EditFile(const char *user, const char *file)
|
|||||||
wait4(pid, NULL, 0, NULL);
|
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
|
static int
|
||||||
ChangeUser(const char *user, short dochdir)
|
ChangeUser(const char *user, short dochdir)
|
||||||
{
|
{
|
||||||
@ -355,7 +343,7 @@ ChangeUser(const char *user, short dochdir)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if ((pas = getpwnam(user)) == 0) {
|
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);
|
return(-1);
|
||||||
}
|
}
|
||||||
setenv("USER", pas->pw_name, 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 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 (dochdir) {
|
||||||
if (chdir(pas->pw_dir) < 0) {
|
if (chdir(pas->pw_dir) < 0) {
|
||||||
|
bb_perror_msg_and_die("chdir failed: %s %s", user, pas->pw_dir);
|
||||||
if (chdir(TMPDIR) < 0) {
|
if (chdir(TMPDIR) < 0) {
|
||||||
log("chdir failed: %s %s", user, pas->pw_dir);
|
bb_perror_msg_and_die("chdir failed: %s %s", user, TMPDIR);
|
||||||
log("chdir failed: %s " TMPDIR, user);
|
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user