>Number:         144974
>Category:       misc
>Synopsis:       [ping6] malloc()s not free()'d
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Mar 23 12:20:01 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Earl R. Lapus
>Release:        FreeBSD 8.0
>Organization:
>Environment:
FreeBSD syutsyut.cebu.infoweapons.com 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Tue 
Dec 15 12:44:45 PHT 2009    r...@syutsyut.cebu.infoweapons.com:/usr/obj/usr/src/
sys/SYUTSYUT  i386

>Description:
Some portions of the code allocates memory via malloc() but aren't free()'d 
when the ping6 exits. The attached patch attempts to fix the problem but may 
not be correct -- needs review.
>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -ruN ../src/sbin/ping6/ping6.c ../src.mod/sbin/ping6/ping6.c
--- ../src/sbin/ping6/ping6.c   2009-10-25 09:10:29.000000000 +0800
+++ ../src.mod/sbin/ping6/ping6.c       2010-03-23 18:32:58.000000000 +0800
@@ -224,6 +224,13 @@
 u_int8_t nonce[8];             /* nonce field for node information */
 int hoplimit = -1;             /* hoplimit */
 int pathmtu = 0;               /* path MTU for the destination.  0 = unspec. */
+u_char *packet = NULL;
+#ifdef HAVE_POLL_H
+struct pollfd fdmaskp[1];
+#else
+fd_set *fdmaskp = NULL;
+int fdmasks;
+#endif
 
 /* counters */
 long nmissedmax;               /* max value of ntransmitted - nreceived - 1 */
@@ -301,19 +308,13 @@
        struct timeval timeout, *tv;
 #endif
        struct addrinfo hints;
-#ifdef HAVE_POLL_H
-       struct pollfd fdmaskp[1];
-#else
-       fd_set *fdmaskp;
-       int fdmasks;
-#endif
        int cc, i;
        int ch, hold, packlen, preload, optval, ret_ga;
-       u_char *datap, *packet;
+       u_char *datap;
        char *e, *target, *ifname = NULL, *gateway = NULL;
        int ip6optlen = 0;
        struct cmsghdr *scmsgp = NULL;
-       struct cmsghdr *cm;
+       struct cmsghdr cm[CONTROLLEN];
 #if defined(SO_SNDBUF) && defined(SO_RCVBUF)
        u_long lsockbufsize;
        int sockbufsize = 0;
@@ -1073,11 +1074,6 @@
        seeninfo = 0;
 #endif
 
-       /* For control (ancillary) data received from recvmsg() */
-       cm = (struct cmsghdr *)malloc(CONTROLLEN);
-       if (cm == NULL)
-               err(1, "malloc");
-
        for (;;) {
                struct msghdr m;
                struct iovec iov[2];
@@ -1149,8 +1145,8 @@
                iov[0].iov_len = packlen;
                m.msg_iov = iov;
                m.msg_iovlen = 1;
-               memset(cm, 0, CONTROLLEN);
-               m.msg_control = (void *)cm;
+               memset(&cm, 0, CONTROLLEN);
+               m.msg_control = (void *)&cm;
                m.msg_controllen = CONTROLLEN;
 
                cc = recvmsg(s, &m, 0);
@@ -1191,6 +1187,15 @@
                }
        }
        summary();
+
+        if(packet != NULL)
+                free(packet);
+
+#ifndef HAVE_POLL_H
+        if(fdmaskp != NULL)
+                free(fdmaskp);
+#endif
+
        exit(nreceived == 0 ? 2 : 0);
 }
 
@@ -2247,6 +2252,14 @@
 {
        summary();
 
+        if(packet != NULL)
+                free(packet);
+
+#ifndef HAVE_POLL_H
+        if(fdmaskp != NULL)
+                free(fdmaskp);
+#endif
+
        (void)signal(SIGINT, SIG_DFL);
        (void)kill(getpid(), SIGINT);
 


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to