svn commit: [25968] trunk/busybox/shell

vda at busybox.net vda at busybox.net
Sun Apr 5 22:17:04 UTC 2009


Author: vda
Date: 2009-04-05 22:17:04 +0000 (Sun, 05 Apr 2009)
New Revision: 25968

Log:
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



Modified:
   trunk/busybox/shell/hush.c


Changeset:
Modified: trunk/busybox/shell/hush.c
===================================================================
--- trunk/busybox/shell/hush.c	2009-04-05 21:19:43 UTC (rev 25967)
+++ trunk/busybox/shell/hush.c	2009-04-05 22:17:04 UTC (rev 25968)
@@ -1225,6 +1225,7 @@
 		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 @@
 			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 @@
 	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 @@
 		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;
 }
 



More information about the busybox-cvs mailing list