]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
terminal-util: use fgetc() carefully instead of fread()
authorLennart Poettering <lennart@poettering.net>
Thu, 18 Oct 2018 11:32:34 +0000 (13:32 +0200)
committerLennart Poettering <lennart@poettering.net>
Thu, 18 Oct 2018 11:32:34 +0000 (13:32 +0200)
src/basic/terminal-util.c

index ba3b9524c6d883f7495193bd36bc16e3dca50921..ea0ba442ff81a948fa59a3c391f5b334ed20755a 100644 (file)
@@ -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';