X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=pppd%2Fmain.c;h=4ec593e067ce6cff787b8101f60cb707faf7cda4;hb=e15bba841ee500abc715fccf876fed4dd2462b1b;hp=214af7723cc7f708e67340584cdce7d9ff5b3a12;hpb=c134aa17fcb7a7730ff9e76010cb1eecb51852a7;p=ppp.git diff --git a/pppd/main.c b/pppd/main.c index 214af77..4ec593e 100644 --- a/pppd/main.c +++ b/pppd/main.c @@ -18,7 +18,7 @@ */ #ifndef lint -static char rcsid[] = "$Id: main.c,v 1.52 1999/01/19 23:59:39 paulus Exp $"; +static char rcsid[] = "$Id: main.c,v 1.56 1999/03/06 11:28:10 paulus Exp $"; #endif #include @@ -448,7 +448,16 @@ main(argc, argv) hungup = 0; kill_link = 0; sigprocmask(SIG_UNBLOCK, &mask, NULL); - while ((ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0)) < 0) { + for (;;) { + /* If the user specified the device name, become the + user before opening it. */ + if (!devnam_info.priv) + seteuid(uid); + ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0); + if (!devnam_info.priv) + seteuid(0); + if (ttyfd >= 0) + break; if (errno != EINTR) syslog(LOG_ERR, "Failed to open %s: %m", devnam); if (!persist || errno != EINTR) @@ -504,7 +513,14 @@ main(argc, argv) /* reopen tty if necessary to wait for carrier */ if (connector == NULL && modem) { - while ((i = open(devnam, O_RDWR)) < 0) { + for (;;) { + if (!devnam_info.priv) + seteuid(uid); + i = open(devnam, O_RDWR); + if (!devnam_info.priv) + seteuid(0); + if (i >= 0) + break; if (errno != EINTR) syslog(LOG_ERR, "Failed to reopen %s: %m", devnam); if (!persist || errno != EINTR || hungup || kill_link) @@ -828,7 +844,7 @@ close_tty() restore_tty(ttyfd); if (tty_mode != (mode_t) -1) { - if (fchmod(devnam, tty_mode) != 0) { + if (fchmod(ttyfd, tty_mode) != 0) { /* XXX if devnam is a symlink, this will change the link */ chmod(devnam, tty_mode); } @@ -1145,7 +1161,7 @@ device_script(program, in, out) close(errfd); } } - setuid(getuid()); + setuid(uid); setgid(getgid()); execl("/bin/sh", "sh", "-c", program, (char *)0); syslog(LOG_ERR, "could not exec /bin/sh: %m"); @@ -1224,10 +1240,10 @@ run_program(prog, args, must_exist, done, arg) int new_fd; /* Leave the current location */ - (void) setsid(); /* No controlling tty. */ + (void) setsid(); /* No controlling tty. */ (void) umask (S_IRWXG|S_IRWXO); - (void) chdir ("/"); /* no current directory. */ - setuid(geteuid()); + (void) chdir ("/"); /* no current directory. */ + setuid(0); /* set real UID = root */ setgid(getegid()); /* Ensure that nothing of our device environment is inherited. */ @@ -1378,10 +1394,12 @@ format_packet(p, len, printer, arg) } } - for (; len > 0; --len) { + for (i = 0; i < len && i < 32; ++i) { GETCHAR(x, p); printer(arg, " %.2x", x); } + if (i < len) + printer(arg, " ..."); } static void