hush: strip NULs from file input, they are PITA/impossible to handle correctly
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 5 Apr 2009 22:17:04 +0000 (22:17 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 5 Apr 2009 22:17:04 +0000 (22:17 -0000)
function                                             old     new   delta
file_peek                                             89      93      +4
file_get                                             260     264      +4

shell/hush.c

index dbb38719a79ef49103d569ed71f46324a40e4abe..fa85ad533a920cbee4e9a574142546d31f69106b 100644 (file)
@@ -1225,6 +1225,7 @@ static int file_get(struct in_str *i)
                ch = *i->p++;
                if (i->eof_flag && !*i->p)
                        ch = EOF;
+               /* note: ch is never NUL */
        } else {
                /* need to double check i->file because we might be doing something
                 * more complicated by now, like sourcing or substituting. */
@@ -1238,9 +1239,9 @@ static int file_get(struct in_str *i)
                        goto take_cached;
                }
 #endif
-               ch = fgetc(i->file);
+               do ch = fgetc(i->file); while (ch == '\0');
        }
-       debug_printf("file_get: got '%c' %d\n", ch, ch);
+       debug_printf("file_get: got '%c' %d\n", ch, ch);
 #if ENABLE_HUSH_INTERACTIVE
        if (ch == '\n')
                i->promptme = 1;
@@ -1248,8 +1249,8 @@ static int file_get(struct in_str *i)
        return ch;
 }
 
-/* All the callers guarantee this routine will never be
- * used right after a newline, so prompting is not needed.
+/* All callers guarantee this routine will never
+ * be used right after a newline, so prompting is not needed.
  */
 static int file_peek(struct in_str *i)
 {
@@ -1258,13 +1259,14 @@ static int file_peek(struct in_str *i)
                if (i->eof_flag && !i->p[1])
                        return EOF;
                return *i->p;
+               /* note: ch is never NUL */
        }
-       ch = fgetc(i->file);
+       do ch = fgetc(i->file); while (ch == '\0');
        i->eof_flag = (ch == EOF);
        i->peek_buf[0] = ch;
        i->peek_buf[1] = '\0';
        i->p = i->peek_buf;
-       debug_printf("file_peek: got a '%c' %d\n", *i->p, *i->p);
+       debug_printf("file_peek: got '%c' %d\n", ch, ch);
        return ch;
 }