svn commit: r319361 - head/sbin/dhclient

Stephen J. Kiernan stevek at FreeBSD.org
Wed May 31 21:31:16 UTC 2017


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 <trix at 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.");


More information about the svn-src-head mailing list