Author: jilles
Date: Tue Dec  8 19:01:05 2009
New Revision: 200269
URL: http://svn.freebsd.org/changeset/base/200269

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

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

Modified: stable/7/bin/sh/arith_lex.l
==============================================================================
--- stable/7/bin/sh/arith_lex.l Tue Dec  8 18:54:37 2009        (r200268)
+++ stable/7/bin/sh/arith_lex.l Tue Dec  8 19:01:05 2009        (r200269)
@@ -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;
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to