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--)
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to