From 423abaa40ec47204a08b2e4d3383b7b74acd1d0a Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Sun, 21 Jul 2019 12:18:31 +0200 Subject: 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 Acked-by: Pablo Neira Ayuso --- src/scanner.l | 35 ++++++++++++++++++++--------------- 1 file 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; \ } \ } -- cgit v1.2.3