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:
44
source/dcc.c
44
source/dcc.c
@@ -3835,32 +3835,42 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user