svn commit: r200188 - stable/8/bin/sh

Jilles Tjoelker jilles at FreeBSD.org
Sun Dec 6 22:01:45 UTC 2009


Author: jilles
Date: Sun Dec  6 22:01:45 2009
New Revision: 200188
URL: http://svn.freebsd.org/changeset/base/200188

Log:
  MFC r198963: sh: Fix memory leak when using a variable in arithmetic
  like $((x)).

Modified:
  stable/8/bin/sh/arith_lex.l
Directory Properties:
  stable/8/bin/sh/   (props changed)

Modified: stable/8/bin/sh/arith_lex.l
==============================================================================
--- stable/8/bin/sh/arith_lex.l	Sun Dec  6 21:42:25 2009	(r200187)
+++ stable/8/bin/sh/arith_lex.l	Sun Dec  6 22:01:45 2009	(r200188)
@@ -51,6 +51,13 @@ __FBSDID("$FreeBSD$");
 
 int yylex(void);
 
+struct varname
+{
+	struct varname *next;
+	char name[1];
+};
+static struct varname *varnames;
+
 #undef YY_INPUT
 #define YY_INPUT(buf,result,max) \
 	result = (*buf = *arith_buf++) ? 1 : YY_NULL;
@@ -80,11 +87,14 @@ int yylex(void);
 			 * If variable doesn't exist, we should initialize
 			 * it to zero.
 			 */
-			char *temp;
+			struct varname *temp;
 			if (lookupvar(yytext) == NULL)
 				setvarsafe(yytext, "0", 0);
-			temp = (char *)ckmalloc(strlen(yytext) + 1);
-			yylval.s_value = strcpy(temp, yytext);
+			temp = ckmalloc(sizeof(struct varname) +
+			    strlen(yytext));
+			temp->next = varnames;
+			varnames = temp;
+			yylval.s_value = strcpy(temp->name, yytext);
 
 			return ARITH_VAR;
 		}
@@ -130,5 +140,15 @@ int yylex(void);
 void
 arith_lex_reset(void)
 {
+	struct varname *name, *next;
+
 	YY_NEW_FILE;
+
+	name = varnames;
+	while (name != NULL) {
+		next = name->next;
+		ckfree(name);
+		name = next;
+	}
+	varnames = NULL;
 }


More information about the svn-src-stable mailing list