From d3f9790c81727cec2bf012a27381feecc40db85e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 18 Oct 2018 13:32:34 +0200 Subject: [PATCH] terminal-util: use fgetc() carefully instead of fread() --- src/basic/terminal-util.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index ba3b952..ea0ba44 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -97,21 +97,26 @@ int read_one_char(FILE *f, char *ret, usec_t t, bool *need_nl) { new_termios.c_cc[VTIME] = 0; if (tcsetattr(fileno(f), TCSADRAIN, &new_termios) >= 0) { - size_t k; + int c; if (t != USEC_INFINITY) { if (fd_wait_for_event(fileno(f), POLLIN, t) <= 0) { - tcsetattr(fileno(f), TCSADRAIN, &old_termios); + (void) tcsetattr(fileno(f), TCSADRAIN, &old_termios); return -ETIMEDOUT; } } - k = fread(&c, 1, 1, f); + errno = 0; + c = fgetc(f); + if (c == EOF) + r = ferror(f) && errno > 0 ? -errno : -EIO; + else + r = 0; - tcsetattr(fileno(f), TCSADRAIN, &old_termios); + (void) tcsetattr(fileno(f), TCSADRAIN, &old_termios); - if (k <= 0) - return -EIO; + if (r < 0) + return r; if (need_nl) *need_nl = c != '\n'; -- 2.7.4