PING6(8): Fix resource leaks

This commit is contained in:
Sebastian Huber 2013-10-31 13:05:19 +01:00
parent 5c3f0b76d8
commit c8ee0d82ad

View File

@ -111,6 +111,7 @@ static const char rcsid[] =
#include <machine/rtems-bsd-commands.h> #include <machine/rtems-bsd-commands.h>
#define USE_RFC2292BIS #define USE_RFC2292BIS
#define HAVE_POLL_H
#endif /* __rtems__ */ #endif /* __rtems__ */
#include <rtems/bsd/sys/param.h> #include <rtems/bsd/sys/param.h>
#include <sys/uio.h> #include <sys/uio.h>
@ -262,6 +263,9 @@ static volatile sig_atomic_t seenint;
static volatile sig_atomic_t seeninfo; static volatile sig_atomic_t seeninfo;
#endif #endif
static u_char *packet;
static struct cmsghdr *cm;
static int main(int, char *[]); static int main(int, char *[]);
static void fill(char *, char *); static void fill(char *, char *);
static int get_hoplim(struct msghdr *); static int get_hoplim(struct msghdr *);
@ -305,8 +309,10 @@ int rtems_bsd_command_ping6(int argc, char **argv)
rtems_bsd_program_lock(); rtems_bsd_program_lock();
memset(&rcvd_tbl[0], 0, sizeof(rcvd_tbl)); memset(&rcvd_tbl[0], 0, sizeof(rcvd_tbl));
res = NULL;
srclen = 0; srclen = 0;
datalen = DEFDATALEN; datalen = DEFDATALEN;
s = -1;
memset(&outpack[0], 0, sizeof(outpack)); memset(&outpack[0], 0, sizeof(outpack));
hoplimit = -1; hoplimit = -1;
nmissedmax = 0; nmissedmax = 0;
@ -329,10 +335,23 @@ int rtems_bsd_command_ping6(int argc, char **argv)
seeninfo = 0; seeninfo = 0;
#endif #endif
packet = NULL;
cm = NULL;
exit_code = rtems_bsd_program_call_main("ping6", main, argc, argv); exit_code = rtems_bsd_program_call_main("ping6", main, argc, argv);
rtems_bsd_program_unlock(); rtems_bsd_program_unlock();
close(s);
free(scmsg);
free(packet);
if (res != NULL) {
freeaddrinfo(res);
}
free(cm);
return exit_code; return exit_code;
} }
#endif /* __rtems__ */ #endif /* __rtems__ */
@ -360,11 +379,10 @@ main(argc, argv)
#endif #endif
int cc, i; int cc, i;
int ch, hold, packlen, preload, optval, ret_ga; int ch, hold, packlen, preload, optval, ret_ga;
u_char *datap, *packet; u_char *datap;
char *e, *target, *ifname = NULL, *gateway = NULL; char *e, *target, *ifname = NULL, *gateway = NULL;
int ip6optlen = 0; int ip6optlen = 0;
struct cmsghdr *scmsgp = NULL; struct cmsghdr *scmsgp = NULL;
struct cmsghdr *cm;
#if defined(SO_SNDBUF) && defined(SO_RCVBUF) #if defined(SO_SNDBUF) && defined(SO_RCVBUF)
u_long lsockbufsize; u_long lsockbufsize;
int sockbufsize = 0; int sockbufsize = 0;
@ -588,6 +606,7 @@ main(argc, argv)
memcpy(&src, res->ai_addr, res->ai_addrlen); memcpy(&src, res->ai_addr, res->ai_addrlen);
srclen = res->ai_addrlen; srclen = res->ai_addrlen;
freeaddrinfo(res); freeaddrinfo(res);
res = NULL;
options |= F_SRCADDR; options |= F_SRCADDR;
break; break;
case 's': /* size of packet to send */ case 's': /* size of packet to send */
@ -716,14 +735,17 @@ main(argc, argv)
error = getaddrinfo(gateway, NULL, &hints, &gres); error = getaddrinfo(gateway, NULL, &hints, &gres);
if (error) { if (error) {
freeaddrinfo(gres);
errx(1, "getaddrinfo for the gateway %s: %s", errx(1, "getaddrinfo for the gateway %s: %s",
gateway, gai_strerror(error)); gateway, gai_strerror(error));
} }
if (gres->ai_next && (options & F_VERBOSE)) if (gres->ai_next && (options & F_VERBOSE))
freeaddrinfo(gres);
warnx("gateway resolves to multiple addresses"); warnx("gateway resolves to multiple addresses");
if (setsockopt(s, IPPROTO_IPV6, IPV6_NEXTHOP, if (setsockopt(s, IPPROTO_IPV6, IPV6_NEXTHOP,
gres->ai_addr, gres->ai_addrlen)) { gres->ai_addr, gres->ai_addrlen)) {
freeaddrinfo(gres);
err(1, "setsockopt(IPV6_NEXTHOP)"); err(1, "setsockopt(IPV6_NEXTHOP)");
} }