Ian Kent ff6f3e
autofs-5.1.0 - check amd lex buffer len before copy
Ian Kent ff6f3e
Ian Kent ff6f3e
From: Ian Kent <ikent@redhat.com>
Ian Kent ff6f3e
Ian Kent ff6f3e
Guard against lex to yacc communication buffer overflow.
Ian Kent ff6f3e
---
Ian Kent ff6f3e
 CHANGELOG         |    1 +
Ian Kent ff6f3e
 modules/amd_tok.l |   49 +++++++++++++++++++++++++++++++------------------
Ian Kent ff6f3e
 2 files changed, 32 insertions(+), 18 deletions(-)
Ian Kent ff6f3e
Ian Kent ff6f3e
diff --git a/CHANGELOG b/CHANGELOG
Ian Kent ff6f3e
index 840e099..dfbaeb1 100644
Ian Kent ff6f3e
--- a/CHANGELOG
Ian Kent ff6f3e
+++ b/CHANGELOG
Ian Kent ff6f3e
@@ -13,6 +13,7 @@
Ian Kent ff6f3e
 - fix buffer size checks in get_network_proximity().
Ian Kent ff6f3e
 - fix leak in get_network_proximity().
Ian Kent ff6f3e
 - fix buffer size checks in merge_options().
Ian Kent ff6f3e
+- check amd lex buffer len before copy.
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 04/06/2014 autofs-5.1.0
Ian Kent ff6f3e
 =======================
Ian Kent ff6f3e
diff --git a/modules/amd_tok.l b/modules/amd_tok.l
Ian Kent ff6f3e
index 5664f67..1d9c234 100644
Ian Kent ff6f3e
--- a/modules/amd_tok.l
Ian Kent ff6f3e
+++ b/modules/amd_tok.l
Ian Kent ff6f3e
@@ -22,6 +22,7 @@
Ian Kent ff6f3e
 # undef ECHO
Ian Kent ff6f3e
 #endif
Ian Kent ff6f3e
 static void amd_echo(void);	/* forward definition */
Ian Kent ff6f3e
+static void amd_copy_buffer(void);
Ian Kent ff6f3e
 #define ECHO amd_echo()
Ian Kent ff6f3e
 int amd_wrap(void);
Ian Kent ff6f3e
 
Ian Kent ff6f3e
@@ -125,26 +126,26 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{MAPOPT} {
Ian Kent ff6f3e
 		BEGIN(MAPOPTVAL);
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return MAP_OPTION;
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{FSOPTS} {
Ian Kent ff6f3e
 		BEGIN(FSOPTVAL);
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return FS_OPTION;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{MNTOPT} {
Ian Kent ff6f3e
 		BEGIN(MNTOPTVAL);
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return MNT_OPTION;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{SELOPT} {
Ian Kent ff6f3e
 		BEGIN(SELOPTVAL);
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SELECTOR;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
@@ -152,13 +153,13 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{SEL1ARG} {
Ian Kent ff6f3e
 		BEGIN(SELARGVAL);
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SELECTOR;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{SEL2ARG} {
Ian Kent ff6f3e
 		BEGIN(SELARGVAL);
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SELECTOR;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
@@ -171,7 +172,7 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 	#.*  { return COMMENT; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{OTHR} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return OTHER;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 }
Ian Kent ff6f3e
@@ -201,22 +202,22 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 	":=" { return OPTION_ASSIGN; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{FSTYPE} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return FS_TYPE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{MAPTYPE} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return MAP_TYPE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{CHEOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return CACHE_OPTION;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{FOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return FS_OPT_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 }
Ian Kent ff6f3e
@@ -246,7 +247,7 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 	":=" { return OPTION_ASSIGN; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{FOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return FS_OPT_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 }
Ian Kent ff6f3e
@@ -278,7 +279,7 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 	"," { return COMMA; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{OPTS} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return OPTION;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 }
Ian Kent ff6f3e
@@ -310,7 +311,7 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 	"!=" { return NOT_EQUAL; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{SOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SELECTOR_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 }
Ian Kent ff6f3e
@@ -335,24 +336,24 @@ CUTSEP		(\|\||\/)
Ian Kent ff6f3e
 	"(" { return LBRACKET; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{NOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SEL_ARG_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{SOPT}/"," {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SEL_ARG_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	"," { return COMMA; }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{SOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SEL_ARG_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
 	{FOPT} {
Ian Kent ff6f3e
-		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+		amd_copy_buffer();
Ian Kent ff6f3e
 		return SEL_ARG_VALUE;
Ian Kent ff6f3e
 	}
Ian Kent ff6f3e
 
Ian Kent ff6f3e
@@ -368,6 +369,18 @@ int amd_wrap(void)
Ian Kent ff6f3e
 	return 1;
Ian Kent ff6f3e
 }
Ian Kent ff6f3e
 
Ian Kent ff6f3e
+static void amd_copy_buffer(void)
Ian Kent ff6f3e
+{
Ian Kent ff6f3e
+	if (amd_leng < 2048)
Ian Kent ff6f3e
+		strcpy(amd_lval.strtype, amd_text);
Ian Kent ff6f3e
+	else {
Ian Kent ff6f3e
+		strncpy(amd_lval.strtype, amd_text, 2047);
Ian Kent ff6f3e
+		amd_lval.strtype[2047] = '\0';
Ian Kent ff6f3e
+		logmsg("warning: truncated option near %s\n",
Ian Kent ff6f3e
+			&amd_lval.strtype[2030]);
Ian Kent ff6f3e
+	}
Ian Kent ff6f3e
+}
Ian Kent ff6f3e
+
Ian Kent ff6f3e
 static void amd_echo(void)
Ian Kent ff6f3e
 {
Ian Kent ff6f3e
 	logmsg("%s\n", amd_text);