]> granicus.if.org Git - sudo/commitdiff
Handle EOF on password input when pwfedback is enabled.
authorTodd C. Miller <Todd.Miller@sudo.ws>
Mon, 8 Oct 2018 12:47:53 +0000 (06:47 -0600)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Mon, 8 Oct 2018 12:47:53 +0000 (06:47 -0600)
lib/util/term.c
src/tgetpass.c

index 657fb6605af9b2a7c4d84dee2bc381d47d2b1174..99d63e6ea955d27df4bf714cbadc737644c231c1 100644 (file)
@@ -97,6 +97,7 @@ static struct termios term, oterm;
 static int changed;
 
 /* tgetpass() needs to know the erase and kill chars for cbreak mode. */
+__dso_public int sudo_term_eof;
 __dso_public int sudo_term_erase;
 __dso_public int sudo_term_kill;
 
@@ -232,6 +233,7 @@ sudo_term_cbreak_v1(int fd)
     term.c_cc[VSTATUS] = _POSIX_VDISABLE;
 #endif
     if (tcsetattr_nobg(fd, TCSASOFT|TCSADRAIN, &term) == 0) {
+       sudo_term_eof = term.c_cc[VEOF];
        sudo_term_erase = term.c_cc[VERASE];
        sudo_term_kill = term.c_cc[VKILL];
        changed = 1;
index 6956c059098bf9aac3b8956b3eb7bfbfd255e147..939fe48ad728b26c1724d5e8ed53a6aa6bb6ed05 100644 (file)
@@ -302,7 +302,7 @@ sudo_askpass(const char *askpass, const char *prompt)
     debug_return_str_masked(pass);
 }
 
-extern int sudo_term_erase, sudo_term_kill;
+extern int sudo_term_eof, sudo_term_erase, sudo_term_kill;
 
 static char *
 getln(int fd, char *buf, size_t bufsiz, int feedback)
@@ -323,7 +323,10 @@ getln(int fd, char *buf, size_t bufsiz, int feedback)
        if (nr != 1 || c == '\n' || c == '\r')
            break;
        if (feedback) {
-           if (c == sudo_term_kill) {
+           if (c == sudo_term_eof) {
+               nr = 0;
+               break;
+           } else if (c == sudo_term_kill) {
                while (cp > buf) {
                    if (write(fd, "\b \b", 3) == -1)
                        break;