mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-09 12:28:19 -04:00
Fixed a fd leak in start_accepting(), plus cosmetic changes
This commit is contained in:
parent
2f33e00af3
commit
4367a33a20
36
listener.c
36
listener.c
@ -350,45 +350,39 @@ static int
|
|||||||
start_accepting(struct accepting_socket *as)
|
start_accepting(struct accepting_socket *as)
|
||||||
{
|
{
|
||||||
/* requires lock */
|
/* requires lock */
|
||||||
int result = -1;
|
const struct win32_extension_fns *ext = event_get_win32_extension_fns();
|
||||||
const struct win32_extension_fns *ext =
|
|
||||||
event_get_win32_extension_fns();
|
|
||||||
SOCKET s = socket(as->family, SOCK_STREAM, 0);
|
|
||||||
DWORD pending = 0;
|
DWORD pending = 0;
|
||||||
|
SOCKET s = socket(as->family, SOCK_STREAM, 0);
|
||||||
if (s == INVALID_SOCKET)
|
if (s == INVALID_SOCKET)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
setsockopt(s,
|
setsockopt(s, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
|
||||||
SOL_SOCKET,
|
(char *)&as->lev->fd, sizeof(&as->lev->fd));
|
||||||
SO_UPDATE_ACCEPT_CONTEXT,
|
|
||||||
(char *)&as->lev->fd,
|
|
||||||
sizeof(&as->lev->fd));
|
|
||||||
|
|
||||||
if (!(as->lev->base.flags & LEV_OPT_LEAVE_SOCKETS_BLOCKING))
|
if (!(as->lev->base.flags & LEV_OPT_LEAVE_SOCKETS_BLOCKING))
|
||||||
evutil_make_socket_nonblocking(s);
|
evutil_make_socket_nonblocking(s);
|
||||||
|
|
||||||
if (event_iocp_port_associate(as->lev->port, s, 1) < 0)
|
if (event_iocp_port_associate(as->lev->port, s, 1) < 0) {
|
||||||
goto done;
|
closesocket(s);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
as->s = s;
|
as->s = s;
|
||||||
|
|
||||||
if (ext->AcceptEx(as->lev->fd, s, as->addrbuf, 0,
|
if (ext->AcceptEx(as->lev->fd, s, as->addrbuf, 0,
|
||||||
as->buflen/2, as->buflen/2,
|
as->buflen/2, as->buflen/2, &pending, &as->overlapped.overlapped))
|
||||||
&pending, &as->overlapped.overlapped)) {
|
{
|
||||||
/* Immediate success! */
|
/* Immediate success! */
|
||||||
accepted_socket_cb(&as->overlapped, 1, 0, 1);
|
accepted_socket_cb(&as->overlapped, 1, 0, 1);
|
||||||
result = 0;
|
|
||||||
} else {
|
} else {
|
||||||
int err = WSAGetLastError();
|
int err = WSAGetLastError();
|
||||||
if (err == ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING) {
|
||||||
result = 0;
|
event_warnx("AcceptEx: %s", evutil_socket_error_to_string(err));
|
||||||
else
|
return -1;
|
||||||
event_warnx("AcceptEx: %s",
|
}
|
||||||
evutil_socket_error_to_string(err));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
return 0;
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user