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:
parent
258275d85f
commit
913a201bf0
14
shell/hush.c
14
shell/hush.c
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user