]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-utils: common.h: fix prompt function
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Wed, 19 Sep 2018 08:57:34 +0000 (10:57 +0200)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Thu, 20 Sep 2018 09:27:01 +0000 (11:27 +0200)
The prompt() function is intended to query a yes/no reply from a command
line user by reading in an entire line of text using getline() and checking
the first character. If the line is empty, a default value is returned.

First of all, this patch replaces the usage of getline() with fgets() to
avoid compilation problems on some smaller C libraries, like klibc, that
do not have a getline() implementation. Since we now have a static line
length, this may break some build setups that input lengthy giberish
instead of 'y' or 'n'.

Second, this patch fixes a more severe bug in prompt(), replacing a 'while'
keyword with the 'if' that was most likely intended. In the old version, if
getline() reported an error, it would print an error message inside a while
loop, immediately followed by a break and then march on and process the
erroneous input instead of using the default value as printed to stdout.

Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
include/common.h

index 2ce5d2252e8787c1d7260cc3954c50f6627bd45c..ece2287c716825ba15d7374b77439780aca4c1cf 100644 (file)
@@ -141,15 +141,14 @@ extern "C" {
  */
 static inline bool prompt(const char *msg, bool def)
 {
-       char *line = NULL;
-       size_t len;
        bool ret = def;
+       char line[64];
 
        do {
                normsg_cont("%s (%c/%c) ", msg, def ? 'Y' : 'y', def ? 'n' : 'N');
                fflush(stdout);
 
-               while (getline(&line, &len, stdin) == -1) {
+               if (fgets(line, sizeof(line), stdin) == NULL) {
                        printf("failed to read prompt; assuming '%s'\n",
                                def ? "yes" : "no");
                        break;
@@ -169,8 +168,6 @@ static inline bool prompt(const char *msg, bool def)
                break;
        } while (1);
 
-       free(line);
-
        return ret;
 }