diff options
author | Florian Westphal <fw@strlen.de> | 2019-07-21 12:18:31 +0200 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2019-07-30 15:46:36 +0200 |
commit | 423abaa40ec47204a08b2e4d3383b7b74acd1d0a (patch) | |
tree | 3d28d7598ab1200df6b1267f6fe9bea1bf90261c /src | |
parent | 25a0de69ea6874c992b703125c6354b006eb6ed1 (diff) |
scanner: don't rely on fseek for input stream repositioning
It doesn't work when reading from a pipe, leading to parser
errors in case of 'cat foo | nft -f -', whereas 'nft -f < foo'
works fine.
Closes: https://bugzilla.netfilter.org/show_bug.cgi?id=1354
Signed-off-by: Florian Westphal <fw@strlen.de>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/scanner.l | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/scanner.l b/src/scanner.l index 4ed5f924..c1adcbdd 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -36,23 +36,28 @@ */ #define YY_INPUT(buf,result,max_size) \ { \ - long n = 0; \ + result = 0; \ errno = 0; \ - while ((result = fread(buf, 1, max_size, yyin)) == 0 && \ - ferror(yyin)) { \ - if (errno != EINTR) { \ - YY_FATAL_ERROR("input in flex scanner failed"); \ - break; \ + \ + while (result < max_size) { \ + int chr = fgetc(yyin); \ + \ + if (chr != EOF) { \ + buf[result++] = chr; \ + if (chr == '\n' || chr == ' ') \ + break; \ + continue; \ } \ - errno = 0; \ - clearerr(yyin); \ - } \ - if (result > 1 && !feof(yyin)) { \ - while (result > 1 && \ - (buf[result - 1] != '\n' && buf[result - 1] != ' ')) \ - result--, n++; \ - result--, n++; \ - fseek(yyin, -n, SEEK_CUR); \ + \ + if (ferror(yyin)) { \ + if (errno != EINTR) { \ + YY_FATAL_ERROR("input in flex scanner failed"); \ + break; \ + } \ + errno = 0; \ + clearerr(yyin); \ + } \ + break; \ } \ } |