diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2020-08-25 11:22:09 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2020-08-25 11:43:02 +0000 |
commit | 4541cf2b96802a47831a0a5f2180027cdf9c6a7f (patch) | |
tree | 91e828d9d17e7e96b84a71cba0a1f0bf15a6c27a /src/socket.c | |
parent | e9fd7ff9d99dd4b040aa6030169405402cbd8116 (diff) |
osmo_sock_inti2_multiaddr: Fix memleak and free uninitialized mem
Under some specific cases, res_loc could be leaked. Under some others,
res_loc and res_rem were freed without being initialized previously.
Fixes: CID#212863
Fixes: CID#212861
Change-Id: Id9c4eda6fd1172e7324aa23c81e8658967a8dd0b
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/socket.c b/src/socket.c index 50d59e58..0b84b99d 100644 --- a/src/socket.c +++ b/src/socket.c @@ -566,8 +566,10 @@ int osmo_sock_init2_multiaddr(uint16_t family, uint16_t type, uint8_t proto, if (flags & OSMO_SOCK_F_CONNECT) { rc = addrinfo_helper_multi(res_rem, family, type, proto, remote_hosts, remote_hosts_cnt, remote_port, false); - if (rc < 0) - return -EINVAL; + if (rc < 0) { + rc = -EINVAL; + goto ret_freeaddrinfo_loc; + } /* Figure out if there's any IPv4 or IPv6 addr in the set */ if (family == AF_UNSPEC) addrinfo_has_v4v6addr((const struct addrinfo **)res_rem, remote_hosts_cnt, @@ -660,10 +662,15 @@ ret_close: if (sfd >= 0) close(sfd); ret_freeaddrinfo: - for (i = 0; i < local_hosts_cnt; i++) - freeaddrinfo(res_loc[i]); - for (i = 0; i < remote_hosts_cnt; i++) - freeaddrinfo(res_rem[i]); + if (flags & OSMO_SOCK_F_CONNECT) { + for (i = 0; i < remote_hosts_cnt; i++) + freeaddrinfo(res_rem[i]); + } +ret_freeaddrinfo_loc: + if (flags & OSMO_SOCK_F_BIND) { + for (i = 0; i < local_hosts_cnt; i++) + freeaddrinfo(res_loc[i]); + } return rc; } #endif /* HAVE_LIBSCTP */ |