svn commit: r353569 - head/usr.bin/rpcgen

Brooks Davis brooks at FreeBSD.org
Tue Oct 15 16:05:18 UTC 2019


Author: brooks
Date: Tue Oct 15 16:05:17 2019
New Revision: 353569
URL: https://svnweb.freebsd.org/changeset/base/353569

Log:
  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)
  MFC after:	1 week
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D21971

Modified:
  head/usr.bin/rpcgen/rpc_main.c

Modified: head/usr.bin/rpcgen/rpc_main.c
==============================================================================
--- head/usr.bin/rpcgen/rpc_main.c	Tue Oct 15 15:52:01 2019	(r353568)
+++ head/usr.bin/rpcgen/rpc_main.c	Tue Oct 15 16:05:17 2019	(r353569)
@@ -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--)


More information about the svn-src-all mailing list