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
This commit is contained in:
Denis Vlasenko 2009-04-05 22:17:04 +00:00
parent 258275d85f
commit 913a201bf0

View File

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