Fix resource leaks in socks_connect()

This commit is contained in:
Přemysl Eric Janouch 2015-02-14 07:11:38 +01:00
parent c1d2518407
commit 781bd24780

View File

@ -1018,17 +1018,11 @@ socks_connect (const char *socks_host, const char *socks_port,
const char *host, const char *port, const char *host, const char *port,
const char *username, const char *password, struct error **e) const char *username, const char *password, struct error **e)
{ {
int result = -1;
struct addrinfo gai_hints, *gai_result; struct addrinfo gai_hints, *gai_result;
memset (&gai_hints, 0, sizeof gai_hints); memset (&gai_hints, 0, sizeof gai_hints);
gai_hints.ai_socktype = SOCK_STREAM; gai_hints.ai_socktype = SOCK_STREAM;
int err = getaddrinfo (socks_host, socks_port, &gai_hints, &gai_result);
if (err)
{
error_set (e, "%s: %s", "getaddrinfo", gai_strerror (err));
return false;
}
unsigned long port_no; unsigned long port_no;
const struct servent *serv; const struct servent *serv;
if ((serv = getservbyname (port, "tcp"))) if ((serv = getservbyname (port, "tcp")))
@ -1036,7 +1030,14 @@ socks_connect (const char *socks_host, const char *socks_port,
else if (!xstrtoul (&port_no, port, 10) || !port_no || port_no > UINT16_MAX) else if (!xstrtoul (&port_no, port, 10) || !port_no || port_no > UINT16_MAX)
{ {
error_set (e, "invalid port number"); error_set (e, "invalid port number");
return false; goto fail;
}
int err = getaddrinfo (socks_host, socks_port, &gai_hints, &gai_result);
if (err)
{
error_set (e, "%s: %s", "getaddrinfo", gai_strerror (err));
goto fail;
} }
struct socks_data data = struct socks_data data =
@ -1052,14 +1053,14 @@ socks_connect (const char *socks_host, const char *socks_port,
data.address.data.domain = host; data.address.data.domain = host;
} }
int fd; if (!socks_5_connect (gai_result, &data, &result, NULL))
bool success = socks_5_connect (gai_result, &data, &fd, NULL) socks_4a_connect (gai_result, &data, &result, e);
|| socks_4a_connect (gai_result, &data, &fd, e);
freeaddrinfo (gai_result);
if (data.bound_address.type == SOCKS_DOMAIN) if (data.bound_address.type == SOCKS_DOMAIN)
free ((char *) data.bound_address.data.domain); free ((char *) data.bound_address.data.domain);
return success ? fd : -1; freeaddrinfo (gai_result);
fail:
return result;
} }
// --- Plugins ----------------------------------------------------------------- // --- Plugins -----------------------------------------------------------------