Date: Tue, 22 Oct 2019 21:24:49 +0000 (UTC) From: Brooks Davis <brooks@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r353901 - stable/12/usr.bin/rpcgen Message-ID: <201910222124.x9MLOnMs043204@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: brooks Date: Tue Oct 22 21:24:48 2019 New Revision: 353901 URL: https://svnweb.freebsd.org/changeset/base/353901 Log: MFC r353569: rpcgen: make compiler arglist allocation dynamic Limit argmax to an absurdly large value prevent overflow (no overflow possible on FreeBSD due to ARG_MAX). In CheriBSD we exceed the 19 non-NULL arguments in the static array. Add a simple size doubling allocator and increase the default to 32. GC remnants of support for fixed arguments. Reviewed by: archardson (prior version), James Clarke (prior version) Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D21971 Modified: stable/12/usr.bin/rpcgen/rpc_main.c Directory Properties: stable/12/ (props changed) Modified: stable/12/usr.bin/rpcgen/rpc_main.c ============================================================================== --- stable/12/usr.bin/rpcgen/rpc_main.c Tue Oct 22 20:41:54 2019 (r353900) +++ stable/12/usr.bin/rpcgen/rpc_main.c Tue Oct 22 21:24:48 2019 (r353901) @@ -93,19 +93,13 @@ static int allnc = nitems(allnv); */ static void addarg(const char *); /* add another argument to the list */ static void insarg(int, const char *); /* insert arg at specified location */ -static void clear_args(void); /* clear argument list */ static void checkfiles(const char *, const char *); /* check if out file already exists */ +static char **arglist; +static int argcount = 0; +static int argmax = 0; - -#define ARGLISTLEN 20 -#define FIXEDARGS 0 - -static char *arglist[ARGLISTLEN]; -static int argcount = FIXEDARGS; - - int nonfatalerrors; /* errors */ int inetdflag = 0; /* Support for inetd is disabled by default, use -I */ int pmflag = 0; /* Support for port monitors is disabled by default */ @@ -141,7 +135,6 @@ main(int argc, const char *argv[]) struct commandline cmd; (void) memset((char *)&cmd, 0, sizeof (struct commandline)); - clear_args(); if (!parseargs(argc, argv, &cmd)) usage(); /* @@ -273,16 +266,6 @@ add_warning(void) f_print(fout, " */\n\n"); } -/* clear list of arguments */ -static void -clear_args(void) -{ - int i; - for (i = FIXEDARGS; i < ARGLISTLEN; i++) - arglist[i] = NULL; - argcount = FIXEDARGS; -} - /* prepend C-preprocessor and flags before arguments */ static void prepend_cpp(void) @@ -925,21 +908,40 @@ do_registers(int argc, const char *argv[]) } /* - * Add another argument to the arg list + * Extend the argument list */ static void -addarg(const char *cp) +moreargs(void) { - if (argcount >= ARGLISTLEN) { - warnx("too many defines"); + char **newarglist; + + argmax = argmax == 0 ? 32 : argmax << 1; + if (argmax > INT_MAX / 4) { + warnx("refusing to allocate too many arguments"); crash(); - /*NOTREACHED*/ } + newarglist = realloc(arglist, argmax * sizeof(*arglist)); + if (newarglist == NULL) { + warnx("unable to allocate arglist"); + crash(); + } + free(arglist); + arglist = newarglist; +} + +/* + * Add another argument to the arg list + */ +static void +addarg(const char *cp) +{ + if (argcount >= argmax) + moreargs(); + if (cp != NULL) arglist[argcount++] = xstrdup(cp); else arglist[argcount++] = NULL; - } /* @@ -950,11 +952,8 @@ insarg(int place, const char *cp) { int i; - if (argcount >= ARGLISTLEN) { - warnx("too many defines"); - crash(); - /*NOTREACHED*/ - } + if (argcount >= argmax) + moreargs(); /* Move up existing arguments */ for (i = argcount - 1; i >= place; i--)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910222124.x9MLOnMs043204>