Blob Blame History Raw
autofs-5.1.0 - fix reset amd lexer scan buffer

From: Ian Kent <ikent@redhat.com>

When the amd parser encounters an error often the lexer is left in
a state where a new parse can't be started. Fix this by explicitly
naming our start states and resetting to the proper start state at
buffer initialization on each scan.
---
 CHANGELOG           |    1 
 modules/amd_tok.l   |   59 +++++++++++++++++++++++++++++++---------------------
 modules/parse_amd.c |    3 ++
 3 files changed, 40 insertions(+), 23 deletions(-)

--- autofs-5.0.7.orig/CHANGELOG
+++ autofs-5.0.7/CHANGELOG
@@ -152,6 +152,7 @@
 - fix memory leak in get_exports().
 - fix memory leak in get_defaults_entry().
 - fix out of order clearing of options buffer.
+- fix reset amd lexer scan buffer.
 
 25/07/2012 autofs-5.0.7
 =======================
--- autofs-5.0.7.orig/modules/amd_tok.l
+++ autofs-5.0.7/modules/amd_tok.l
@@ -1,4 +1,3 @@
-%{
 /* ----------------------------------------------------------------------- *
  *
  *  Copyright 2013 Ian Kent <raven@themaw.net>
@@ -18,6 +17,12 @@
  *
  * ----------------------------------------------------------------------- */
 
+%s START MAPOPTVAL FSOPTVAL MNTOPTVAL SELOPTVAL SELARGVAL
+
+%{
+
+static int reset_start_state = 0;
+
 #ifdef ECHO
 # undef ECHO
 #endif
@@ -71,8 +76,6 @@ int amd_yyinput(char *, int);
 
 %option nounput
 
-%x MAPOPTVAL FSOPTVAL MNTOPTVAL SELOPTVAL SELARGVAL
-
 NL		\r?\n
 OPTWS		[[:blank:]]*
 OTHR		[^!;:=/|\- \t\r\n#]*
@@ -120,7 +123,14 @@ CUTSEP		(\|\||\/)
 
 %%
 
-<INITIAL>{
+%{
+	if (reset_start_state) {
+		BEGIN START;
+		reset_start_state = 0;
+	}
+%}
+
+<START>{
 	{NL} |
 	\x00 { }
 
@@ -179,23 +189,23 @@ CUTSEP		(\|\||\/)
 
 <MAPOPTVAL>{
 	{NL} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		yyless(1);
 	}
 
 	\x00 {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 		yyless(1);
 	}
 
 	";" {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 	}
 
 	{OPTWS} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SPACE;
 	}
 
@@ -224,23 +234,23 @@ CUTSEP		(\|\||\/)
 
 <FSOPTVAL>{
 	{NL} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		yyless(1);
 	}
 
 	\x00 {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 		yyless(1);
 	}
 
 	";" {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 	}
 
 	{OPTWS} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SPACE;
 	}
 
@@ -254,23 +264,23 @@ CUTSEP		(\|\||\/)
 
 <MNTOPTVAL>{
 	{NL} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		yyless(1);
 	}
 
 	\x00 {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 		yyless(1);
 	}
 
 	";" {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 	}
 
 	{OPTWS} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SPACE;
 	}
 
@@ -286,23 +296,23 @@ CUTSEP		(\|\||\/)
 
 <SELOPTVAL>{
 	{NL} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		yyless(1);
 	}
 
 	\x00 {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 		yyless(1);
 	}
 
 	";" {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 	}
 
 	{OPTWS} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SPACE;
 	}
 
@@ -318,18 +328,18 @@ CUTSEP		(\|\||\/)
 
 <SELARGVAL>{
 	{NL} {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		yyless(1);
 	}
 
 	\x00 {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 		yyless(1);
 	}
 
 	";" {
-		BEGIN(INITIAL);
+		BEGIN(START);
 		return SEPERATOR;
 	}
 
@@ -391,6 +401,9 @@ static void amd_echo(void)
 
 void amd_set_scan_buffer(const char *buffer)
 {
+	YY_FLUSH_BUFFER;
+	reset_start_state = 1;
+
 	line = buffer;
 	line_pos = &line[0];
 	/*
--- autofs-5.0.7.orig/modules/parse_amd.c
+++ autofs-5.0.7/modules/parse_amd.c
@@ -1798,6 +1798,9 @@ static struct amd_entry *get_defaults_en
 		if (!expand_selectors(ap, defaults, &expand, sv))
 			goto out;
 		if (amd_parse_list(ap, expand, &dflts, &sv)) {
+			error(ap->logopt, MODPREFIX
+			     "failed to parse defaults entry, "
+			     "attempting to use internal default");
 			free(expand);
 			goto out;
 		}