From a01f25b5f1543ca54c24f632a3b44e0c3f8b8064 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Thu, 13 Mar 2003 20:27:09 +0000 Subject: [PATCH] Don't assume libc can realloc() a NULL string. If malloc/realloc fails, make sure we just return; yyerror() is not terminal. --- parse.lex | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/parse.lex b/parse.lex index c128e55b8..d355ea13d 100644 --- 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; } -- 2.40.0