Changeset 215 in openpam


Ignore:
Timestamp:
May 13, 2003, 2:40:18 PM (16 years ago)
Author:
Dag-Erling Smørgrav
Message:

Support su'ing to another user with arguments. Drop privs in the
child rather than in the parent so that pam_close_session(3) will be
called with privs. Simplify some of the error handling.

Based on patches received from Mike Petullo <mike@…>.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/bin/su/su.c

    r157 r215  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/bin/su/su.c#8 $
     34 * $P4: //depot/projects/openpam/bin/su/su.c#9 $
    3535 */
    3636
     
    8282        argv += optind;
    8383
     84        if (argc > 0) {
     85                user = *argv;
     86                --argc;
     87                ++argv;
     88        } else {
     89                user = "root";
     90        }
     91
    8492        /* initialize PAM */
    8593        pamc.conv = &openpam_ttyconv;
    86         pam_start("su", argc ? *argv : "root", &pamc, &pamh);
     94        pam_start("su", user, &pamc, &pamh);
    8795
    8896        /* set some items */
     
    118126                goto pamerr;
    119127
    120         /* set uid and groups */
    121         if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {
    122                 warn("initgroups()");
    123                 goto err;
    124         }
    125         if (setgid(pwd->pw_gid) == -1) {
    126                 warn("setgid()");
    127                 goto err;
    128         }
    129         if (setuid(pwd->pw_uid) == -1) {
    130                 warn("setuid()");
    131                 goto err;
    132         }
    133 
    134128        /* export PAM environment */
    135129        if ((pam_envlist = pam_getenvlist(pamh)) != NULL) {
     
    155149                goto err;
    156150        case 0:
    157                 /* child: start a shell */
     151                /* child: give up privs and start a shell */
     152
     153                /* set uid and groups */
     154                if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {
     155                        warn("initgroups()");
     156                        _exit(1);
     157                }
     158                if (setgid(pwd->pw_gid) == -1) {
     159                        warn("setgid()");
     160                        _exit(1);
     161                }
     162                if (setuid(pwd->pw_uid) == -1) {
     163                        warn("setuid()");
     164                        _exit(1);
     165                }
    158166                execve(*args, args, environ);
    159167                warn("execve()");
     
    171179
    172180pamerr:
    173         pam_end(pamh, pam_err);
    174181        fprintf(stderr, "Sorry\n");
    175         exit(1);
    176182err:
    177183        pam_end(pamh, pam_err);
Note: See TracChangeset for help on using the changeset viewer.