svn commit: r353939 - stable/11/usr.bin/rpcgen
Brooks Davis
brooks at FreeBSD.org
Wed Oct 23 17:28:36 UTC 2019
Author: brooks
Date: Wed Oct 23 17:28:35 2019
New Revision: 353939
URL: https://svnweb.freebsd.org/changeset/base/353939
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/11/usr.bin/rpcgen/rpc_main.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/usr.bin/rpcgen/rpc_main.c
==============================================================================
--- stable/11/usr.bin/rpcgen/rpc_main.c Wed Oct 23 17:20:20 2019 (r353938)
+++ stable/11/usr.bin/rpcgen/rpc_main.c Wed Oct 23 17:28:35 2019 (r353939)
@@ -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)
@@ -921,21 +904,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;
-
}
/*
@@ -946,11 +948,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--)
More information about the svn-src-stable-11
mailing list