summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2019-07-21 12:18:31 +0200
committerFlorian Westphal <fw@strlen.de>2019-07-30 15:46:36 +0200
commit423abaa40ec47204a08b2e4d3383b7b74acd1d0a (patch)
tree3d28d7598ab1200df6b1267f6fe9bea1bf90261c
parent25a0de69ea6874c992b703125c6354b006eb6ed1 (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>
-rw-r--r--src/scanner.l35
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; \
} \
}