aboutsummaryrefslogtreecommitdiff
path: root/src/net.c
diff options
context:
space:
mode:
authorJef Poskanzer <jef@mail.acme.com>2013-11-09 14:23:36 -0800
committerJef Poskanzer <jef@mail.acme.com>2013-11-09 14:23:36 -0800
commit32ebd649b397ee4315e07f94e2861019136d3b3c (patch)
treea4ec7b515aa1e58b623befaf7207e7719b7c3fd3 /src/net.c
parent0e60ef1f9c72191466fbe767b5448f8137194b6b (diff)
downloadiperf3-32ebd649b397ee4315e07f94e2861019136d3b3c.tar.gz
Fixed some memory & fd leaks in error cases of various network setup
routines.
Diffstat (limited to 'src/net.c')
-rw-r--r--src/net.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/net.c b/src/net.c
index 460c0bd..9573f1e 100644
--- a/src/net.c
+++ b/src/net.c
@@ -65,18 +65,29 @@ netdial(int domain, int proto, char *local, char *server, int port)
return -1;
s = socket(server_res->ai_family, proto, 0);
- if (s < 0)
+ if (s < 0) {
+ if (local)
+ freeaddrinfo(local_res);
+ freeaddrinfo(server_res);
return -1;
+ }
if (local) {
- if (bind(s, (struct sockaddr *) local_res->ai_addr, local_res->ai_addrlen) < 0)
+ if (bind(s, (struct sockaddr *) local_res->ai_addr, local_res->ai_addrlen) < 0) {
+ close(s);
+ freeaddrinfo(local_res);
+ freeaddrinfo(server_res);
return -1;
+ }
freeaddrinfo(local_res);
}
((struct sockaddr_in *) server_res->ai_addr)->sin_port = htons(port);
- if (connect(s, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen) < 0 && errno != EINPROGRESS)
+ if (connect(s, (struct sockaddr *) server_res->ai_addr, server_res->ai_addrlen) < 0 && errno != EINPROGRESS) {
+ close(s);
+ freeaddrinfo(server_res);
return -1;
+ }
freeaddrinfo(server_res);
return s;
@@ -100,8 +111,10 @@ netannounce(int domain, int proto, char *local, int port)
return -1;
s = socket(res->ai_family, proto, 0);
- if (s < 0)
+ if (s < 0) {
+ freeaddrinfo(res);
return -1;
+ }
opt = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt));
@@ -115,6 +128,7 @@ netannounce(int domain, int proto, char *local, int port)
if (bind(s, (struct sockaddr *) res->ai_addr, res->ai_addrlen) < 0) {
close(s);
+ freeaddrinfo(res);
return -1;
}
@@ -122,6 +136,7 @@ netannounce(int domain, int proto, char *local, int port)
if (proto == SOCK_STREAM) {
if (listen(s, 5) < 0) {
+ close(s);
return -1;
}
}