diff options
author | brucec <brucec@FreeBSD.org> | 2010-06-16 15:49:17 +0000 |
---|---|---|
committer | brucec <brucec@FreeBSD.org> | 2010-06-16 15:49:17 +0000 |
commit | 9f6e36d162d51d1ed63f899b3627db4ef7c7e637 (patch) | |
tree | f488b0a5eca8632608028e899bc57505b3a5d2de /sbin | |
parent | 2f90e1d7fcc2224c3b8450ec20a8baf426500919 (diff) | |
download | FreeBSD-src-9f6e36d162d51d1ed63f899b3627db4ef7c7e637.zip FreeBSD-src-9f6e36d162d51d1ed63f899b3627db4ef7c7e637.tar.gz |
Call free and freeaddrinfo before exiting.
PR: bin/144730
PR: bin/144974
Submitted by: Earl R. Lapus <earl.lapus at gmail.com>
Approved by: rrs (mentor)
MFC after: 1 month
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/ping6/ping6.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/sbin/ping6/ping6.c b/sbin/ping6/ping6.c index 69a98b2..0a834af 100644 --- a/sbin/ping6/ping6.c +++ b/sbin/ping6/ping6.c @@ -210,7 +210,7 @@ u_int options; int mx_dup_ck = MAX_DUP_CHK; char rcvd_tbl[MAX_DUP_CHK / 8]; -struct addrinfo *res; +struct addrinfo *res = NULL; struct sockaddr_in6 dst; /* who to ping6 */ struct sockaddr_in6 src; /* src addr of this packet */ socklen_t srclen; @@ -225,6 +225,13 @@ int ident; /* process id to identify our packets */ 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 */ @@ -302,19 +309,14 @@ main(argc, argv) 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; + /* For control (ancillary) data received from recvmsg() */ + struct cmsghdr cm[CONTROLLEN]; #if defined(SO_SNDBUF) && defined(SO_RCVBUF) u_long lsockbufsize; int sockbufsize = 0; @@ -529,6 +531,7 @@ main(argc, argv) memcpy(&src, res->ai_addr, res->ai_addrlen); srclen = res->ai_addrlen; freeaddrinfo(res); + res = NULL; options |= F_SRCADDR; break; case 's': /* size of packet to send */ @@ -1081,11 +1084,6 @@ main(argc, argv) 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]; @@ -1199,6 +1197,18 @@ main(argc, argv) } } summary(); + + if (res != NULL) + freeaddrinfo(res); + + if(packet != NULL) + free(packet); + +#ifndef HAVE_POLL_H + if(fdmaskp != NULL) + free(fdmaskp); +#endif + exit(nreceived == 0 ? 2 : 0); } @@ -2255,6 +2265,17 @@ onint(notused) { summary(); + if (res != NULL) + freeaddrinfo(res); + + if(packet != NULL) + free(packet); + +#ifndef HAVE_POLL_H + if(fdmaskp != NULL) + free(fdmaskp); +#endif + (void)signal(SIGINT, SIG_DFL); (void)kill(getpid(), SIGINT); |