unix, windows: validate flags on uv_udp|tcp_bind

fixes #1247
This commit is contained in:
Saúl Ibarra Corretgé 2014-04-22 22:45:58 +02:00
parent d86d86633e
commit 9b4f2b84f1
4 changed files with 27 additions and 0 deletions

View File

@ -63,6 +63,10 @@ int uv__tcp_bind(uv_tcp_t* tcp,
int err;
int on;
/* Cannot set IPv6-only mode on non-IPv6 socket. */
if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6)
return -EINVAL;
err = maybe_new_socket(tcp,
addr->sa_family,
UV_STREAM_READABLE | UV_STREAM_WRITABLE);

View File

@ -243,6 +243,10 @@ static int uv_tcp_try_bind(uv_tcp_t* handle,
int r;
if (handle->socket == INVALID_SOCKET) {
/* Cannot set IPv6-only mode on non-IPv6 socket. */
if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6)
return ERROR_INVALID_PARAMETER;
SOCKET sock = socket(addr->sa_family, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
return WSAGetLastError();

View File

@ -65,6 +65,7 @@ TEST_DECLARE (tcp_bind_error_addrnotavail_2)
TEST_DECLARE (tcp_bind_error_fault)
TEST_DECLARE (tcp_bind_error_inval)
TEST_DECLARE (tcp_bind_localhost_ok)
TEST_DECLARE (tcp_bind_invalid_flags)
TEST_DECLARE (tcp_listen_without_bind)
TEST_DECLARE (tcp_connect_error_fault)
TEST_DECLARE (tcp_connect_timeout)
@ -335,6 +336,7 @@ TASK_LIST_START
TEST_ENTRY (tcp_bind_error_fault)
TEST_ENTRY (tcp_bind_error_inval)
TEST_ENTRY (tcp_bind_localhost_ok)
TEST_ENTRY (tcp_bind_invalid_flags)
TEST_ENTRY (tcp_listen_without_bind)
TEST_ENTRY (tcp_connect_error_fault)
TEST_ENTRY (tcp_connect_timeout)

View File

@ -185,6 +185,23 @@ TEST_IMPL(tcp_bind_localhost_ok) {
}
TEST_IMPL(tcp_bind_invalid_flags) {
struct sockaddr_in addr;
uv_tcp_t server;
int r;
ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
r = uv_tcp_init(uv_default_loop(), &server);
ASSERT(r == 0);
r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, UV_TCP_IPV6ONLY);
ASSERT(r == UV_EINVAL);
MAKE_VALGRIND_HAPPY();
return 0;
}
TEST_IMPL(tcp_listen_without_bind) {
int r;
uv_tcp_t server;