From e8695d536c48a8f74e604e41016bb0a79f1297bc Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Mon, 31 Mar 2025 08:50:12 -0600 Subject: [PATCH] Use a pointer to end of buffer instead of tracking space left. Fixes a problem in feedback mode where an initial backspace would reduce the effective buffer size. GitHub issue #439 --- src/tgetpass.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/tgetpass.c b/src/tgetpass.c index bb222ea68..b883d9ec7 100644 --- a/src/tgetpass.c +++ b/src/tgetpass.c @@ -379,21 +379,22 @@ static char * getln(int fd, char *buf, size_t bufsiz, bool feedback, enum tgetpass_errval *errval) { - size_t left = bufsiz; ssize_t nr = -1; + const char *ep; char *cp = buf; char c = '\0'; debug_decl(getln, SUDO_DEBUG_CONV); *errval = TGP_ERRVAL_NOERROR; - if (left == 0) { + if (bufsiz == 0) { *errval = TGP_ERRVAL_READERROR; errno = EINVAL; debug_return_str(NULL); } + ep = buf + bufsiz - 1; /* reserve space for NUL byte */ - while (--left) { + while (cp < ep) { nr = read(fd, &c, 1); if (nr != 1 || c == '\n' || c == '\r') break; @@ -408,13 +409,11 @@ getln(int fd, char *buf, size_t bufsiz, bool feedback, cp--; } cp = buf; - left = bufsiz; continue; } else if (c == sudo_term_erase) { if (cp > buf) { ignore_result(write(fd, "\b \b", 3)); cp--; - left++; } continue; } @@ -428,7 +427,7 @@ getln(int fd, char *buf, size_t bufsiz, bool feedback, while (cp > buf) { if (write(fd, "\b \b", 3) != 3) break; - --cp; + cp--; } } @@ -444,7 +443,7 @@ getln(int fd, char *buf, size_t bufsiz, bool feedback, debug_return_str(NULL); case 0: /* EOF is only an error if no bytes were read. */ - if (left == bufsiz - 1) { + if (buf[0] == '\0') { *errval = TGP_ERRVAL_NOPASSWORD; debug_return_str(NULL); }