]> granicus.if.org Git - neomutt/commitdiff
Avoid UB when clearing stdin
authorFederico Kircheis <federico.kircheis@gmail.com>
Tue, 1 May 2018 14:55:20 +0000 (16:55 +0200)
committerRichard Russon <rich@flatcap.org>
Sat, 29 Jun 2019 11:54:30 +0000 (12:54 +0100)
Flushing `stdin` is undefined behaviour.

References
 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, chapter 7.21.5.2 (The fflush function)
 http://en.cppreference.com/w/c/io/fflush

curs_lib.c

index fc045a5fba4756788f1d4d587d6ce06e9976bf32..921e5aa305e7e2f5edbdc10e2d2256b09136bc6c 100644 (file)
@@ -523,6 +523,19 @@ void mutt_perror_debug(const char *s)
   mutt_error("%s: %s (errno = %d)", s, p ? p : _("unknown error"), errno);
 }
 
+/**
+ * mutt_flush_stdin - remove characters from stdin until '\n' or EOF is encountered
+ */
+void mutt_flush_stdin(void)
+{
+  int c;
+  do 
+  {
+    c = fgetc(stdin);
+  } while ((c != '\n') && (c != EOF));
+}
+
+
 /**
  * mutt_any_key_to_continue - Prompt the user to 'press any key' and wait
  * @param s Message prompt
@@ -550,7 +563,7 @@ int mutt_any_key_to_continue(const char *s)
     fputs(_("Press any key to continue..."), stdout);
   fflush(stdout);
   int ch = fgetc(stdin);
-  fflush(stdin);
+  mutt_flush_stdin();
   tcsetattr(fd, TCSADRAIN, &old);
   close(fd);
   fputs("\r\n", stdout);