From 913a201bf098a5fbe1da02cb332d7d0787974c4d Mon Sep 17 00:00:00 2001
From: Denis Vlasenko <vda.linux@googlemail.com>
Date: Sun, 5 Apr 2009 22:17:04 +0000
Subject: hush: strip NULs from file input, they are PITA/impossible to handle
 correctly

function                                             old     new   delta
file_peek                                             89      93      +4
file_get                                             260     264      +4
---
 shell/hush.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

(limited to 'shell')

diff --git a/shell/hush.c b/shell/hush.c
index dbb38719a..fa85ad533 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -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 a '%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;
 }
 
-- 
cgit v1.2.3-55-g6feb