tcpdrop makes two getaddrinfo() calls:

        if ((gaierr = getaddrinfo(laddr1, port1, &hints, &laddr)) != 0)
                errx(1, "%s port %s: %s", addr1, port1,
                    gai_strerror(gaierr));

        if ((gaierr = getaddrinfo(faddr2, port2, &hints, &faddr)) != 0) {
                freeaddrinfo(laddr);
                errx(1, "%s port %s: %s", addr2, port2,
                    gai_strerror(gaierr));
        }

However, their corresponding freeaddrinfo() calls will not be called if
either of the two getnameinfo() calls in the subsequent for loop fails.

This diff ensures that both freeaddrinfo() calls are called in that
error path.

ok?


Index: tcpdrop.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdrop/tcpdrop.c,v
retrieving revision 1.14
diff -u -p -r1.14 tcpdrop.c
--- tcpdrop.c   29 Jun 2014 00:58:45 -0000      1.14
+++ tcpdrop.c   23 Dec 2014 03:58:56 -0000
@@ -47,7 +47,7 @@ main(int argc, char **argv)
        char lhbuf[NI_MAXHOST], lsbuf[NI_MAXSERV];
        char *laddr1, *addr1, *port1, *faddr2, *addr2, *port2;
        struct tcp_ident_mapping tir;
-       int gaierr, rval = 0;
+       int gaierr = 0, rval = 0;
 
        memset(&hints, 0, sizeof(hints));
        hints.ai_family = AF_UNSPEC;
@@ -125,11 +125,11 @@ fail:
                        if ((gaierr = getnameinfo(aif->ai_addr, aif->ai_addrlen,
                            fhbuf, sizeof(fhbuf), fsbuf, sizeof(fsbuf),
                            NI_NUMERICHOST | NI_NUMERICSERV)) != 0)
-                               errx(1, "getnameinfo: %s", 
gai_strerror(gaierr));
+                               goto done;
                        if ((gaierr = getnameinfo(ail->ai_addr, ail->ai_addrlen,
                            lhbuf, sizeof(lhbuf), lsbuf, sizeof(lsbuf),
                            NI_NUMERICHOST | NI_NUMERICSERV)) != 0)
-                               errx(1, "getnameinfo: %s", 
gai_strerror(gaierr));
+                               goto done;
 
                        if (sysctl(mib, sizeof (mib) / sizeof (int), NULL,
                            NULL, &tir, sizeof(tir)) == -1) {
@@ -145,7 +145,10 @@ fail:
                        }
                }
        }
+done:
        freeaddrinfo(laddr);
        freeaddrinfo(faddr);
+       if (gaierr)
+               errx(1, "getnameinfo: %s", gai_strerror(gaierr));
        exit(rval);
 }

Reply via email to