diff mbox

[nft] scanner: fix reading of really long line

Message ID 1417278278-30206-1-git-send-email-eric@regit.org
State Accepted
Delegated to: Pablo Neira
Headers show

Commit Message

Eric Leblond Nov. 29, 2014, 4:24 p.m. UTC
Current code is causing a failure in adding a set containing
a really long list of elements. The failure occurs as soon as
the line is longer than flex read buffer.

When a line is longer than scanner buffer size, the code in YY_INPUT
forces a rewind to the beginning of the string because it does not
find a end of line. The result is that the string is never parsed.

This patch updates the code by rewinding till we found a space.

Signed-off-by: Eric Leblond <eric@regit.org>
---
 src/scanner.l | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Pablo Neira Ayuso Dec. 1, 2014, 11:55 a.m. UTC | #1
On Sat, Nov 29, 2014 at 05:24:38PM +0100, Eric Leblond wrote:
> Current code is causing a failure in adding a set containing
> a really long list of elements. The failure occurs as soon as
> the line is longer than flex read buffer.
> 
> When a line is longer than scanner buffer size, the code in YY_INPUT
> forces a rewind to the beginning of the string because it does not
> find a end of line. The result is that the string is never parsed.
> 
> This patch updates the code by rewinding till we found a space.

But the part that didn't fit in will be ignore, right? So the user
will lose some elements in the set?

If so, I think it's better to spot an error via YY_FATAL_ERROR to
indicate that the line is too long to the user.
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/scanner.l b/src/scanner.l
index f0ed8d4..2fafa71 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -47,7 +47,8 @@ 
 		clearerr(yyin);							\
 	}									\
 	if (result > 1) {							\
-		while (result > 1 && buf[result - 1] != '\n')			\
+		while (result > 1 && 						\
+		       (buf[result - 1] != '\n' &&  buf[result - 1] != ' '))	\
 			result--, n++;						\
 		result--, n++;							\
 		fseek(yyin, -n, SEEK_CUR);					\