Author: stevek
Date: Wed May 31 21:31:15 2017
New Revision: 319361
URL: https://svnweb.freebsd.org/changeset/base/319361

Log:
  parse.c parse_string
  When parse_semi fails, free s before returning
  
  parse.c parse_numeric_aggregate
  The memory assigned to bufp is complicated, it can either be from the input
  parameter buf or allocated locally. Introduce a new variable lbufp to track
  when it is assigned locally and to free it when appropriate.
  
  Submitted by: Thomas Rix <t...@juniper.net>
  Reviewed by:  jhb
  Approved by:  sjg (mentor)
  Obtained from:        Juniper Networks, Inc.
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D9899

Modified:
  head/sbin/dhclient/parse.c

Modified: head/sbin/dhclient/parse.c
==============================================================================
--- head/sbin/dhclient/parse.c  Wed May 31 21:20:42 2017        (r319360)
+++ head/sbin/dhclient/parse.c  Wed May 31 21:31:15 2017        (r319361)
@@ -131,8 +131,10 @@ parse_string(FILE *cfile)
                error("no memory for string %s.", val);
        memcpy(s, val, valsize);
 
-       if (!parse_semi(cfile))
+       if (!parse_semi(cfile)) {
+               free(s);
                return (NULL);
+       }
        return (s);
 }
 
@@ -246,9 +248,10 @@ parse_numeric_aggregate(FILE *cfile, unsigned char *bu
        char *val, *t;
        size_t valsize;
        pair c = NULL;
+       unsigned char *lbufp = NULL;
 
        if (!bufp && *max) {
-               bufp = malloc(*max * size / 8);
+               lbufp = bufp = malloc(*max * size / 8);
                if (!bufp)
                        error("can't allocate space for numeric aggregate");
        } else
@@ -265,6 +268,7 @@ parse_numeric_aggregate(FILE *cfile, unsigned char *bu
                                parse_warn("too few numbers.");
                                if (token != SEMI)
                                        skip_to_semi(cfile);
+                               free(lbufp);
                                return (NULL);
                        }
                        token = next_token(&val, cfile);
@@ -281,6 +285,7 @@ parse_numeric_aggregate(FILE *cfile, unsigned char *bu
                    (base != 16 || token != NUMBER_OR_NAME)) {
                        parse_warn("expecting numeric value.");
                        skip_to_semi(cfile);
+                       free(lbufp);
                        return (NULL);
                }
                /*
@@ -302,6 +307,7 @@ parse_numeric_aggregate(FILE *cfile, unsigned char *bu
 
        /* If we had to cons up a list, convert it now. */
        if (c) {
+               free(lbufp);
                bufp = malloc(count * size / 8);
                if (!bufp)
                        error("can't allocate space for numeric aggregate.");
_______________________________________________
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