]> granicus.if.org Git - sudo/commitdiff
Don't assume libc can realloc() a NULL string.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 13 Mar 2003 20:27:09 +0000 (20:27 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 13 Mar 2003 20:27:09 +0000 (20:27 +0000)
If malloc/realloc fails, make sure we just return; yyerror() is not terminal.

parse.lex

index c128e55b8014dcebf637eecdb0fd6095fb2bdda9..d355ea13d47287ab80dc510ffcbc7354a230f23d 100644 (file)
--- a/parse.lex
+++ b/parse.lex
@@ -365,8 +365,10 @@ fill(s, len)
     int i, j;
 
     yylval.string = (char *) malloc(len + 1);
-    if (yylval.string == NULL)
+    if (yylval.string == NULL) {
        yyerror("unable to allocate memory");
+       return;
+    }
 
     /* Copy the string and collapse any escaped characters. */
     for (i = 0, j = 0; i < len; i++, j++) {
@@ -386,8 +388,10 @@ fill_cmnd(s, len)
     arg_len = arg_size = 0;
 
     yylval.command.cmnd = (char *) malloc(len + 1);
-    if (yylval.command.cmnd == NULL)
+    if (yylval.command.cmnd == NULL) {
        yyerror("unable to allocate memory");
+       return;
+    }
 
     /* copy the string and NULL-terminate it (escapes handled by fnmatch) */
     (void) strncpy(yylval.command.cmnd, s, len);
@@ -416,10 +420,14 @@ fill_args(s, len, addspace)
        while (new_len >= (arg_size += COMMANDARGINC))
            ;
 
-       if ((p = (char *) realloc(yylval.command.args, arg_size)) == NULL) {
+       p = yylval.command.args ?
+           (char *) realloc(yylval.command.args, arg_size) :
+           (char *) malloc(arg_size);
+       if (p == NULL) {
            if (yylval.command.args != NULL)
                free(yylval.command.args);
            yyerror("unable to allocate memory");
+           return;
        } else
            yylval.command.args = p;
     }