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

Reply via email to