Imported Upstream version 1.7.6p1
[debian/sudo] / tgetpass.c
index 8127eab1e0540bf8a89f81d8bbee97e9a3ad593a..b64bb8d3e51e5ca3c8379f4ecbba7f68aac00b37 100644 (file)
@@ -57,7 +57,7 @@
 
 static volatile sig_atomic_t signo[NSIG];
 
-static void handler __P((int));
+static RETSIGTYPE handler __P((int));
 static char *getln __P((int, char *, size_t, int));
 static char *sudo_askpass __P((const char *));
 
@@ -80,7 +80,7 @@ tgetpass(prompt, timeout, flags)
 
     /* If using a helper program to get the password, run it instead. */
     if (ISSET(flags, TGP_ASKPASS) && user_askpass)
-       return(sudo_askpass(prompt));
+       return sudo_askpass(prompt);
 
 restart:
     for (i = 0; i < NSIG; i++)
@@ -127,8 +127,10 @@ restart:
     sa.sa_handler = SIG_IGN;
     (void) sigaction(SIGPIPE, &sa, &savepipe);
 
-    if (prompt)
-       (void) write(output, prompt, strlen(prompt));
+    if (prompt) {
+       if (write(output, prompt, strlen(prompt)) == -1)
+           goto restore;
+    }
 
     if (timeout > 0)
        alarm(timeout);
@@ -136,9 +138,12 @@ restart:
     alarm(0);
     save_errno = errno;
 
-    if (neednl || pass == NULL)
-       (void) write(output, "\n", 1);
+    if (neednl || pass == NULL) {
+       if (write(output, "\n", 1) == -1)
+           goto restore;
+    }
 
+restore:
     /* Restore old tty settings and signals. */
     if (!ISSET(flags, TGP_ECHO))
        term_restore(input, 1);
@@ -175,7 +180,7 @@ restart:
 
     if (save_errno)
        errno = save_errno;
-    return(pass);
+    return pass;
 }
 
 /*
@@ -223,7 +228,7 @@ sudo_askpass(prompt)
     (void) close(pfd[0]);
     (void) sigaction(SIGPIPE, &saved_sa_pipe, NULL);
 
-    return(pass);
+    return pass;
 }
 
 extern int term_erase, term_kill;
@@ -242,7 +247,7 @@ getln(fd, buf, bufsiz, feedback)
 
     if (left == 0) {
        errno = EINVAL;
-       return(NULL);                   /* sanity */
+       return NULL;                    /* sanity */
     }
 
     while (--left) {
@@ -252,20 +257,23 @@ getln(fd, buf, bufsiz, feedback)
        if (feedback) {
            if (c == term_kill) {
                while (cp > buf) {
-                   (void) write(fd, "\b \b", 3);
+                   if (write(fd, "\b \b", 3) == -1)
+                       break;
                    --cp;
                }
                left = bufsiz;
                continue;
            } else if (c == term_erase) {
                if (cp > buf) {
-                   (void) write(fd, "\b \b", 3);
+                   if (write(fd, "\b \b", 3) == -1)
+                       break;
                    --cp;
                    left++;
                }
                continue;
            }
-           (void) write(fd, "*", 1);
+           if (write(fd, "*", 1) == -1)
+               /* shut up glibc */;
        }
        *cp++ = c;
     }
@@ -273,15 +281,16 @@ getln(fd, buf, bufsiz, feedback)
     if (feedback) {
        /* erase stars */
        while (cp > buf) {
-           (void) write(fd, "\b \b", 3);
+           if (write(fd, "\b \b", 3) == -1)
+               break;
            --cp;
        }
     }
 
-    return(nr == 1 ? buf : NULL);
+    return nr == 1 ? buf : NULL;
 }
 
-static void
+static RETSIGTYPE
 handler(s)
     int s;
 {
@@ -296,5 +305,5 @@ tty_present()
 
     if ((fd = open(_PATH_TTY, O_RDWR|O_NOCTTY)) != -1)
        close(fd);
-    return(fd != -1);
+    return fd != -1;
 }