From: shemminger Date: Wed, 21 Sep 2005 19:33:17 +0000 (+0000) Subject: Fix leaks and warnings reported by valgrind. X-Git-Tag: ss-050929~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ed63ab1f1283b2c63355fb7c1e80abead4b9399;p=thirdparty%2Fiproute2.git Fix leaks and warnings reported by valgrind. --- diff --git a/ChangeLog b/ChangeLog index fec24979f..dd1973db9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-09-21 Stephen Hemminger + + * Fix uninitialized memory and leaks with valgrind + Reported by Redhat + 2005-09-01 Mike Frysinger * Fix build issues with netem tables (parallel make and HOSTCC) diff --git a/ip/ip.c b/ip/ip.c index b6ff2df02..f57651e77 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -122,6 +122,8 @@ static int batch(const char *name) break; } } + if (line) + free(line); rtnl_close(&rth); return ret; diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 30d60ec48..cb164c04d 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -494,7 +494,7 @@ int ipaddr_list_or_flush(int argc, char **argv, int flush) { struct nlmsg_list *linfo = NULL; struct nlmsg_list *ainfo = NULL; - struct nlmsg_list *l; + struct nlmsg_list *l, *n; char *filter_dev = NULL; int no_link = 0; @@ -695,13 +695,15 @@ int ipaddr_list_or_flush(int argc, char **argv, int flush) } } - for (l=linfo; l; l = l->next) { + for (l=linfo; l; l = n) { + n = l->next; if (no_link || print_linkinfo(NULL, &l->h, stdout) == 0) { struct ifinfomsg *ifi = NLMSG_DATA(&l->h); if (filter.family != AF_PACKET) print_selected_addrinfo(ifi->ifi_index, ainfo, stdout); } fflush(stdout); + free(l); } return 0; diff --git a/lib/libnetlink.c b/lib/libnetlink.c index f7e89059a..82f811bbb 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -30,7 +30,8 @@ void rtnl_close(struct rtnl_handle *rth) close(rth->fd); } -int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, int protocol) +int rtnl_open_byproto(struct rtnl_handle *rth, unsigned subscriptions, + int protocol) { socklen_t addr_len; int sndbuf = 32768; @@ -95,6 +96,7 @@ int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type) memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; + memset(&req, 0, sizeof(req)); req.nlh.nlmsg_len = sizeof(req); req.nlh.nlmsg_type = type; req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST; @@ -102,7 +104,8 @@ int rtnl_wilddump_request(struct rtnl_handle *rth, int family, int type) req.nlh.nlmsg_seq = rth->dump = ++rth->seq; req.g.rtgen_family = family; - return sendto(rth->fd, (void*)&req, sizeof(req), 0, (struct sockaddr*)&nladdr, sizeof(nladdr)); + return sendto(rth->fd, (void*)&req, sizeof(req), 0, + (struct sockaddr*)&nladdr, sizeof(nladdr)); } int rtnl_send(struct rtnl_handle *rth, const char *buf, int len) @@ -119,12 +122,15 @@ int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len) { struct nlmsghdr nlh; struct sockaddr_nl nladdr; - struct iovec iov[2] = { { &nlh, sizeof(nlh) }, { req, len } }; + struct iovec iov[2] = { + { .iov_base = &nlh, .iov_len = sizeof(nlh) }, + { .iov_base = req, .iov_len = len } + }; struct msghdr msg = { - (void*)&nladdr, sizeof(nladdr), - iov, 2, - NULL, 0, - 0 + .msg_name = &nladdr, + .msg_namelen = sizeof(nladdr), + .msg_iov = iov, + .msg_iovlen = 2, }; memset(&nladdr, 0, sizeof(nladdr)); @@ -145,21 +151,22 @@ int rtnl_dump_filter(struct rtnl_handle *rth, rtnl_filter_t junk, void *arg2) { - char buf[16384]; struct sockaddr_nl nladdr; - struct iovec iov = { buf, sizeof(buf) }; + struct iovec iov; + struct msghdr msg = { + .msg_name = &nladdr, + .msg_namelen = sizeof(nladdr), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + char buf[16384]; + iov.iov_base = buf; while (1) { int status; struct nlmsghdr *h; - struct msghdr msg = { - (void*)&nladdr, sizeof(nladdr), - &iov, 1, - NULL, 0, - 0 - }; - + iov.iov_len = sizeof(buf); status = recvmsg(rth->fd, &msg, 0); if (status < 0) { @@ -168,14 +175,11 @@ int rtnl_dump_filter(struct rtnl_handle *rth, perror("OVERRUN"); continue; } + if (status == 0) { fprintf(stderr, "EOF on netlink\n"); return -1; } - if (msg.msg_namelen != sizeof(nladdr)) { - fprintf(stderr, "sender address length == %d\n", msg.msg_namelen); - exit(1); - } h = (struct nlmsghdr*)buf; while (NLMSG_OK(h, status)) { @@ -231,14 +235,14 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, unsigned seq; struct nlmsghdr *h; struct sockaddr_nl nladdr; - struct iovec iov = { (void*)n, n->nlmsg_len }; - char buf[16384]; + struct iovec iov; struct msghdr msg = { - (void*)&nladdr, sizeof(nladdr), - &iov, 1, - NULL, 0, - 0 + .msg_name = &nladdr, + .msg_namelen = sizeof(nladdr), + .msg_iov = &iov, + .msg_iovlen = 1, }; + char buf[16384]; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; @@ -340,7 +344,7 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer, } } -int rtnl_listen(struct rtnl_handle *rtnl, +int rtnl_listen(struct rtnl_handle *rtnl, rtnl_filter_t handler, void *jarg) { @@ -348,22 +352,20 @@ int rtnl_listen(struct rtnl_handle *rtnl, struct nlmsghdr *h; struct sockaddr_nl nladdr; struct iovec iov; - char buf[8192]; struct msghdr msg = { - (void*)&nladdr, sizeof(nladdr), - &iov, 1, - NULL, 0, - 0 + .msg_name = &nladdr, + .msg_namelen = sizeof(nladdr), + .msg_iov = &iov, + .msg_iovlen = 1, }; + char buf[8192]; memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = 0; nladdr.nl_groups = 0; - iov.iov_base = buf; - while (1) { iov.iov_len = sizeof(buf); status = recvmsg(rtnl->fd, &msg, 0); @@ -485,7 +487,7 @@ int addattr32(struct nlmsghdr *n, int maxlen, int type, __u32 data) return 0; } -int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, +int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen) { int len = RTA_LENGTH(alen); @@ -533,7 +535,7 @@ int rta_addattr32(struct rtattr *rta, int maxlen, int type, __u32 data) return 0; } -int rta_addattr_l(struct rtattr *rta, int maxlen, int type, +int rta_addattr_l(struct rtattr *rta, int maxlen, int type, const void *data, int alen) { struct rtattr *subrta; diff --git a/tc/tc.c b/tc/tc.c index 793eab24a..16d6c795b 100644 --- a/tc/tc.c +++ b/tc/tc.c @@ -246,6 +246,8 @@ static int batch(const char *name) break; } } + if (line) + free(line); rtnl_close(&rth); return ret;