svn commit: r315322 - head/usr.sbin/syslogd

Ngie Cooper ngie at FreeBSD.org
Wed Mar 15 18:15:32 UTC 2017


Author: ngie
Date: Wed Mar 15 18:15:30 2017
New Revision: 315322
URL: https://svnweb.freebsd.org/changeset/base/315322

Log:
  syslogd: fix memory leaks in main(..) and allowaddr(..)
  
  - main(..): free memory assigned to fdsr before calling die(..).
  - allowaddr(..): free memory assigned to ap before returning from the
    function early. Add a `err` goto label to reduce freeaddrinfo/free(ap)
    logic duplication.
  
  MFC after:	1 week
  X-MFC notes:	some of this is dependent on refactoring not MFCed
  Reported by:	clang static analyzer, Coverity
  CID:		1367750 (ap leakage in allowaddr(..))
  Submitted by:	Tom Rix <trix at juniper.net>
  Reviewed by:	ngie
  Sponsored by:	Dell EMC Isilon, Juniper
  Differential Revision:	D10004

Modified:
  head/usr.sbin/syslogd/syslogd.c

Modified: head/usr.sbin/syslogd/syslogd.c
==============================================================================
--- head/usr.sbin/syslogd/syslogd.c	Wed Mar 15 18:14:54 2017	(r315321)
+++ head/usr.sbin/syslogd/syslogd.c	Wed Mar 15 18:15:30 2017	(r315322)
@@ -685,8 +685,10 @@ main(int argc, char *argv[])
 			reapchild(WantReapchild);
 		if (MarkSet)
 			markit();
-		if (WantDie)
+		if (WantDie) {
+			free(fdsr);
 			die(WantDie);
+		}
 
 		bzero(fdsr, howmany(fdsrmax+1, NFDBITS) *
 		    sizeof(fd_mask));
@@ -2438,7 +2440,7 @@ allowaddr(char *s)
 	struct allowedpeer *ap;
 	struct servent *se;
 	int masklen = -1;
-	struct addrinfo hints, *res;
+	struct addrinfo hints, *res = NULL;
 #ifdef INET
 	in_addr_t *addrp, *maskp;
 #endif
@@ -2465,8 +2467,9 @@ allowaddr(char *s)
 			ap->port = ntohs(se->s_port);
 		} else {
 			ap->port = strtol(cp1, &cp2, 0);
+			/* port not numeric */
 			if (*cp2 != '\0')
-				return (-1); /* port not numeric */
+				goto err;
 		}
 	} else {
 		if ((se = getservbyname("syslog", "udp")))
@@ -2480,7 +2483,7 @@ allowaddr(char *s)
 	    strspn(cp1 + 1, "0123456789") == strlen(cp1 + 1)) {
 		*cp1 = '\0';
 		if ((masklen = atoi(cp1 + 1)) < 0)
-			return (-1);
+			goto err;
 	}
 #ifdef INET6
 	if (*s == '[') {
@@ -2526,8 +2529,7 @@ allowaddr(char *s)
 				/* convert masklen to netmask */
 				*maskp = htonl(~((1 << (32 - masklen)) - 1));
 			} else {
-				freeaddrinfo(res);
-				return (-1);
+				goto err;
 			}
 			/* Lose any host bits in the network number. */
 			*addrp &= *maskp;
@@ -2535,10 +2537,9 @@ allowaddr(char *s)
 #endif
 #ifdef INET6
 		case AF_INET6:
-			if (masklen > 128) {
-				freeaddrinfo(res);
-				return (-1);
-			}
+			if (masklen > 128)
+				goto err;
+
 			if (masklen < 0)
 				masklen = 128;
 			mask6p = (uint32_t *)&sstosin6(&ap->a_mask)->sin6_addr.s6_addr32[0];
@@ -2559,8 +2560,7 @@ allowaddr(char *s)
 			break;
 #endif
 		default:
-			freeaddrinfo(res);
-			return (-1);
+			goto err;
 		}
 		freeaddrinfo(res);
 	} else {
@@ -2596,7 +2596,13 @@ allowaddr(char *s)
 		printf("port = %d\n", ap->port);
 	}
 #endif
+
 	return (0);
+err:
+	if (res != NULL)
+		freeaddrinfo(res);
+	free(ap);
+	return (-1);
 }
 
 /*


More information about the svn-src-all mailing list