Make getsockname/getpeername handle uninitialized sockets better

This commit is contained in:
Bert Belder 2011-09-04 19:18:56 +02:00
parent 12b01e95f9
commit 360f4119e4
4 changed files with 54 additions and 4 deletions

View File

@ -131,6 +131,18 @@ int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name,
/* Don't clobber errno. */
saved_errno = errno;
if (handle->delayed_error) {
uv_err_new(handle->loop, handle->delayed_error);
rv = -1;
goto out;
}
if (handle->fd < 0) {
uv_err_new(handle->loop, EINVAL);
rv = -1;
goto out;
}
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;
@ -141,6 +153,7 @@ int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name,
*namelen = (int)socklen;
}
out:
errno = saved_errno;
return rv;
}
@ -155,6 +168,18 @@ int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name,
/* Don't clobber errno. */
saved_errno = errno;
if (handle->delayed_error) {
uv_err_new(handle->loop, handle->delayed_error);
rv = -1;
goto out;
}
if (handle->fd < 0) {
uv_err_new(handle->loop, EINVAL);
rv = -1;
goto out;
}
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;
@ -165,6 +190,7 @@ int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name,
*namelen = (int)socklen;
}
out:
errno = saved_errno;
return rv;
}

View File

@ -469,6 +469,12 @@ int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name,
/* Don't clobber errno. */
saved_errno = errno;
if (handle->fd < 0) {
uv_err_new(handle->loop, EINVAL);
rv = -1;
goto out;
}
/* sizeof(socklen_t) != sizeof(int) on some systems. */
socklen = (socklen_t)*namelen;
@ -479,6 +485,7 @@ int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name,
*namelen = (int)socklen;
}
out:
errno = saved_errno;
return rv;
}

View File

@ -419,6 +419,8 @@ int uv_tcp_accept(uv_tcp_t* server, uv_tcp_t* client) {
rv = -1;
} else {
uv_connection_init((uv_stream_t*) client);
/* AcceptEx() implicitly binds the accepted socket. */
client->flags |= UV_HANDLE_BOUND;
}
/* Prepare the req to pick up a new connection */
@ -578,8 +580,13 @@ int uv_tcp_getsockname(uv_tcp_t* handle, struct sockaddr* name,
uv_loop_t* loop = handle->loop;
int result;
if (handle->flags & UV_HANDLE_SHUTTING) {
uv_set_sys_error(loop, WSAESHUTDOWN);
if (!(handle->flags & UV_HANDLE_BOUND)) {
uv_set_sys_error(loop, WSAEINVAL);
return -1;
}
if (handle->flags & UV_HANDLE_BIND_ERROR) {
loop->last_error = handle->bind_error;
return -1;
}
@ -598,8 +605,13 @@ int uv_tcp_getpeername(uv_tcp_t* handle, struct sockaddr* name,
uv_loop_t* loop = handle->loop;
int result;
if (handle->flags & UV_HANDLE_SHUTTING) {
uv_set_sys_error(loop, WSAESHUTDOWN);
if (!(handle->flags & UV_HANDLE_BOUND)) {
uv_set_sys_error(loop, WSAEINVAL);
return -1;
}
if (handle->flags & UV_HANDLE_BIND_ERROR) {
loop->last_error = handle->bind_error;
return -1;
}

View File

@ -45,6 +45,11 @@ int uv_udp_getsockname(uv_udp_t* handle, struct sockaddr* name,
uv_loop_t* loop = handle->loop;
int result;
if (!(handle->flags & UV_HANDLE_BOUND)) {
uv_set_sys_error(loop, WSAEINVAL);
return -1;
}
result = getsockname(handle->socket, name, namelen);
if (result != 0) {
uv_set_sys_error(loop, WSAGetLastError());