mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-07-27 18:20:46 +08:00
PING6(8): Fix resource leaks
This commit is contained in:
parent
5c3f0b76d8
commit
c8ee0d82ad
@ -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)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user