Cleanups in open_listen_port()

This fixes a few issues in this function - the socket type should be 'int' not 'socklen_t', the
error cases should close() the socket so it doesn't leak.
This commit is contained in:
Kevin Easton
2016-10-21 16:37:18 +11:00
parent caba4c830c
commit 09e53eb6d4

View File

@@ -3836,31 +3836,41 @@ int err;
int open_listen_port(int s) int open_listen_port(int s)
{ {
struct sockaddr_in data_addr = { 0 }; struct sockaddr_in data_addr = { 0 };
socklen_t len = sizeof(struct sockaddr_in), data = -1; socklen_t len = sizeof(struct sockaddr_in);
int on = 1; int data_s;
char *a, *p; const int on = 1;
unsigned char *a, *p;
if (getsockname(s, (struct sockaddr *)&data_addr, &len) < 0) if (getsockname(s, (struct sockaddr *)&data_addr, &len) < 0)
return -1; return -1;
data_addr.sin_port = 0; data_addr.sin_port = 0;
if ((data = socket(AF_INET, SOCK_STREAM, 0)) < 0) if ((data_s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -1; return -1;
if ((setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on))) < 0) if ((setsockopt(data_s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0)
{
close(data_s);
return -1; return -1;
if ((bind(data, (struct sockaddr *)&data_addr, sizeof(data_addr))) < 0) }
if ((bind(data_s, (struct sockaddr *)&data_addr, sizeof(data_addr))) < 0)
{
close(data_s);
return -1; return -1;
len = sizeof(struct sockaddr_in); }
getsockname(data, (struct sockaddr *)&data_addr, &len); if ((listen(data_s, 1)) < 0)
{
close(data_s);
return -1;
}
a = (char *)&data_addr.sin_addr; len = sizeof(struct sockaddr_in);
p = (char *)&data_addr.sin_port; getsockname(data_s, (struct sockaddr *)&data_addr, &len);
#define UC(b) (((int)b)&0xff)
dcc_printf(s, "PORT %d,%d,%d,%d,%d,%d\n", UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),UC(p[0]), UC(p[1])); a = (unsigned char *)&data_addr.sin_addr;
#undef UC p = (unsigned char *)&data_addr.sin_port;
if ((listen(data, 1)) < 0) dcc_printf(s, "PORT %d,%d,%d,%d,%d,%d\n", a[0], a[1], a[2], a[3], p[0], p[1]);
return -1;
return data; return data_s;
} }