Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Oct 2014 05:39:32 +0000 (UTC)
From:      Marcelo Araujo <araujo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r273576 - head/sys/dev/uart
Message-ID:  <201410240539.s9O5dWWK002150@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: araujo (ports committer)
Date: Fri Oct 24 05:39:32 2014
New Revision: 273576
URL: https://svnweb.freebsd.org/changeset/base/273576

Log:
  Fix a leaked Storage Variable.
  
  Phabric:	D981
  Submitted by:	myself
  Reported by:	Coverity
  CID:		1248848
  Reworked by:	kevlo
  Reviewed by:	marcel, davide, ray, kevlo
  Approved by:	marcel, kevlo

Modified:
  head/sys/dev/uart/uart_subr.c

Modified: head/sys/dev/uart/uart_subr.c
==============================================================================
--- head/sys/dev/uart/uart_subr.c	Fri Oct 24 04:01:14 2014	(r273575)
+++ head/sys/dev/uart/uart_subr.c	Fri Oct 24 05:39:32 2014	(r273576)
@@ -196,7 +196,7 @@ out:
 int
 uart_getenv(int devtype, struct uart_devinfo *di, struct uart_class *class)
 {
-	const char *spec;
+	const char *cp, *spec;
 	bus_addr_t addr = ~0U;
 	int error;
 
@@ -214,12 +214,12 @@ uart_getenv(int devtype, struct uart_dev
 	 * port (resp).
 	 */
 	if (devtype == UART_DEV_CONSOLE)
-		spec = kern_getenv("hw.uart.console");
+		cp = kern_getenv("hw.uart.console");
 	else if (devtype == UART_DEV_DBGPORT)
-		spec = kern_getenv("hw.uart.dbgport");
+		cp = kern_getenv("hw.uart.dbgport");
 	else
-		spec = NULL;
-	if (spec == NULL)
+		cp = NULL;
+	if (cp == NULL)
 		return (ENXIO);
 
 	/* Set defaults. */
@@ -232,6 +232,7 @@ uart_getenv(int devtype, struct uart_dev
 	di->parity = UART_PARITY_NONE;
 
 	/* Parse the attributes. */
+	spec = cp;
 	while (1) {
 		switch (uart_parse_tag(&spec)) {
 		case UART_TAG_BR:
@@ -267,14 +268,18 @@ uart_getenv(int devtype, struct uart_dev
 			di->bas.rclk = uart_parse_long(&spec);
 			break;
 		default:
+			freeenv(__DECONST(char *, cp));
 			return (EINVAL);
 		}
 		if (*spec == '\0')
 			break;
-		if (*spec != ',')
+		if (*spec != ',') {
+			freeenv(__DECONST(char *, cp));
 			return (EINVAL);
+		}
 		spec++;
 	}
+	freeenv(__DECONST(char *, cp));
 
 	/*
 	 * If we still have an invalid address, the specification must be



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201410240539.s9O5dWWK002150>