[ale] Correct Signal Handling

Chris Fowler cfowler at outpostsentinel.com
Thu Dec 6 09:39:34 EST 2001


Hello,

I'm writing a simple program to change the uid of a user to that of root.  Like su.  I need 
corectly set the signals in theis program so that when any termination signals are sent 
to the SHELL that the porgram contiunes and termintes normally.  Should I place the
child in its own process group?  Below is code:



#define SHELL "/bin/sh"

void become_root(void);

static struct config cfg;

/* NOTE!!:
 *
 * This program must be suid as root to operate correctly!
 *
 */

int
become_admin(int argc, char *argv[])
{
        char *password;

        if(readcfg(&cfg, sizeof(struct config)) == -1)
                err_quit("read config");

        openlog("admin", LOG_PID, LOG_AUTHPRIV);

        password = getpass("password: ");

        log_info("user->admin attempt by: %s", getenv("LOGNAME"));

        if(strcmp(cfg.user[0].password, (char *)crypt(password, cfg.user[0].password)) == 0)
                become_root();


        log_info("user->admin failed for %s\n", getenv("LOGNAME"));

        fprintf(stderr, "access denied");
        return 0;
}

void
become_root(void)
{
        int pid;

        log_info("user->admin succeeded by %s", getenv("LOGNAME"));

        signal(SIGQUIT, SIG_IGN);
        signal(SIGHUP, SIG_IGN);

        pid = fork();

        if(pid < 0)
                err_quit("fork");

        if(pid == 0)
        {
                extern char **environ;
                setgid(0);
                setuid(0);

                execle(SHELL, SHELL,0, environ);
                err_quit("exec");
        }

        wait(NULL);

        log_info("user->admin exited by: %s", getenv("LOGNAME"));

        exit(0);
}


Thanks,
Chris Fowler



---
This message has been sent through the ALE general discussion list.
See http://www.ale.org/mailing-lists.shtml for more info. Problems should be 
sent to listmaster at ale dot org.






More information about the Ale mailing list