--- embedaddon/sudo/src/tgetpass.c 2012/05/29 12:26:49 1.1.1.2 +++ embedaddon/sudo/src/tgetpass.c 2013/10/14 07:56:35 1.1.1.5 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 1998-2005, 2007-2011 + * Copyright (c) 1996, 1998-2005, 2007-2013 * Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any @@ -26,7 +26,6 @@ #include #include -#include #include #ifdef STDC_HEADERS # include @@ -54,10 +53,11 @@ #include #include "sudo.h" +#include "sudo_plugin.h" static volatile sig_atomic_t signo[NSIG]; -static void handler(int); +static void tgetpass_handler(int); static char *getln(int, char *, size_t, int); static char *sudo_askpass(const char *, const char *); @@ -71,14 +71,14 @@ tgetpass(const char *prompt, int timeout, int flags) sigaction_t savetstp, savettin, savettou, savepipe; char *pass; static const char *askpass; - static char buf[SUDO_PASS_MAX + 1]; + static char buf[SUDO_CONV_REPL_MAX + 1]; int i, input, output, save_errno, neednl = 0, need_restart; debug_decl(tgetpass, SUDO_DEBUG_CONV) (void) fflush(stdout); if (askpass == NULL) { - askpass = getenv("SUDO_ASKPASS"); + askpass = getenv_unhooked("SUDO_ASKPASS"); if (askpass == NULL || *askpass == '\0') askpass = sudo_conf_askpass_path(); } @@ -86,7 +86,7 @@ tgetpass(const char *prompt, int timeout, int flags) /* If no tty present and we need to disable echo, try askpass. */ if (!ISSET(flags, TGP_STDIN|TGP_ECHO|TGP_ASKPASS|TGP_NOECHO_TRY) && !tty_present()) { - if (askpass == NULL || getenv("DISPLAY") == NULL) { + if (askpass == NULL || getenv_unhooked("DISPLAY") == NULL) { warningx(_("no tty present and no askpass program specified")); debug_return_str(NULL); } @@ -96,7 +96,7 @@ tgetpass(const char *prompt, int timeout, int flags) /* If using a helper program to get the password, run it instead. */ if (ISSET(flags, TGP_ASKPASS)) { if (askpass == NULL || *askpass == '\0') - errorx(1, _("no askpass program specified, try setting SUDO_ASKPASS")); + fatalx(_("no askpass program specified, try setting SUDO_ASKPASS")); debug_return_str_masked(sudo_askpass(askpass, prompt)); } @@ -128,10 +128,10 @@ restart: * Catch signals that would otherwise cause the user to end * up with echo turned off in the shell. */ - zero_bytes(&sa, sizeof(sa)); + memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_INTERRUPT; /* don't restart system calls */ - sa.sa_handler = handler; + sa.sa_handler = tgetpass_handler; (void) sigaction(SIGALRM, &sa, &savealrm); (void) sigaction(SIGINT, &sa, &saveint); (void) sigaction(SIGHUP, &sa, &savehup); @@ -208,17 +208,17 @@ restore: static char * sudo_askpass(const char *askpass, const char *prompt) { - static char buf[SUDO_PASS_MAX + 1], *pass; + static char buf[SUDO_CONV_REPL_MAX + 1], *pass; sigaction_t sa, saved_sa_pipe; int pfd[2]; pid_t pid; debug_decl(sudo_askpass, SUDO_DEBUG_CONV) if (pipe(pfd) == -1) - error(1, _("unable to create pipe")); + fatal(_("unable to create pipe")); if ((pid = fork()) == -1) - error(1, _("unable to fork")); + fatal(_("unable to fork")); if (pid == 0) { /* child, point stdout to output side of the pipe and exec askpass */ @@ -226,7 +226,8 @@ sudo_askpass(const char *askpass, const char *prompt) warning("dup2"); _exit(255); } - (void) setuid(ROOT_UID); + if (setuid(ROOT_UID) == -1) + warning("setuid(%d)", ROOT_UID); if (setgid(user_details.gid)) { warning(_("unable to set gid to %u"), (unsigned int)user_details.gid); _exit(255); @@ -242,7 +243,7 @@ sudo_askpass(const char *askpass, const char *prompt) } /* Ignore SIGPIPE in case child exits prematurely */ - zero_bytes(&sa, sizeof(sa)); + memset(&sa, 0, sizeof(sa)); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_INTERRUPT; sa.sa_handler = SIG_IGN; @@ -316,7 +317,7 @@ getln(int fd, char *buf, size_t bufsiz, int feedback) } static void -handler(int s) +tgetpass_handler(int s) { if (s != SIGALRM) signo[s] = 1;