On Thu, Dec 24, 2015 at 12:41:28PM -0500, Michael McConville wrote:
> 1. realloc acts like malloc when ptr == NULL
Why not
"#endif",
- " if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)",
- " goto bail;",
- " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :",
- " (short *)malloc(newsize * sizeof *newss); /* overflow check
above */",
+ " newss = reallocarray(yyss, newsize, sizeof(*newss));
instead?
Note however that the commit message in which the overflow checks were
introduced says
revision 1.28
date: 2007/09/03 21:14:58; author: deraadt; state: Exp; lines: +13 -4;
move back to using malloc() instead of calloc(), because the yacc
skeleton really should only call malloc/realloc/free, no other external
APIs at all. theefore, add a pre-check for the overflow case, thus
protecting realloc too; tested mblamer, ok millert, help from kettenis
but that was long before reallocarray existed, so I'm not sure.
> 2. no need to check for NULL before free
>
> ok?
>
>
> ? cscope.out
> Index: skeleton.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/yacc/skeleton.c,v
> retrieving revision 1.35
> diff -u -p -r1.35 skeleton.c
> --- skeleton.c 16 Mar 2014 18:38:30 -0000 1.35
> +++ skeleton.c 24 Dec 2015 17:34:02 -0000
> @@ -137,16 +137,14 @@ char *body[] =
> "#endif",
> " if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)",
> " goto bail;",
> - " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :",
> - " (short *)malloc(newsize * sizeof *newss); /* overflow check
> above */",
> + " newss = realloc(yyss, newsize * sizeof(*newss)); /* overflow check
> above */",
> " if (newss == NULL)",
> " goto bail;",
> " yyss = newss;",
> " yyssp = newss + sslen;",
> " if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)",
> " goto bail;",
> - " newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs)
> :",
> - " (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check
> above */",
> + " newvs = realloc(yyvs, newsize * sizeof(*newvs)); /* overflow check
> above */",
> " if (newvs == NULL)",
> " goto bail;",
> " yyvs = newvs;",
> @@ -155,10 +153,8 @@ char *body[] =
> " yysslim = yyss + newsize - 1;",
> " return 0;",
> "bail:",
> - " if (yyss)",
> - " free(yyss);",
> - " if (yyvs)",
> - " free(yyvs);",
> + " free(yyss);",
> + " free(yyvs);",
> " yyss = yyssp = NULL;",
> " yyvs = yyvsp = NULL;",
> " yystacksize = 0;",
> @@ -368,19 +364,15 @@ char *trailer[] =
> "yyoverflow:",
> " yyerror(\"yacc stack overflow\");",
> "yyabort:",
> - " if (yyss)",
> - " free(yyss);",
> - " if (yyvs)",
> - " free(yyvs);",
> + " free(yyss);",
> + " free(yyvs);",
> " yyss = yyssp = NULL;",
> " yyvs = yyvsp = NULL;",
> " yystacksize = 0;",
> " return (1);",
> "yyaccept:",
> - " if (yyss)",
> - " free(yyss);",
> - " if (yyvs)",
> - " free(yyvs);",
> + " free(yyss);",
> + " free(yyvs);",
> " yyss = yyssp = NULL;",
> " yyvs = yyvsp = NULL;",
> " yystacksize = 0;",
>