diff --git a/include/uv-private/uv-unix.h b/include/uv-private/uv-unix.h index fed7f8de..49e81bcf 100644 --- a/include/uv-private/uv-unix.h +++ b/include/uv-private/uv-unix.h @@ -131,8 +131,7 @@ struct uv__io_s { #define UV_UDP_SEND_PRIVATE_FIELDS \ ngx_queue_t queue; \ - struct sockaddr_storage addr; \ - socklen_t addrlen; \ + struct sockaddr_in6 addr; \ uv_buf_t* bufs; \ int bufcnt; \ ssize_t status; \ diff --git a/src/unix/udp.c b/src/unix/udp.c index 495939c7..523d2823 100644 --- a/src/unix/udp.c +++ b/src/unix/udp.c @@ -116,7 +116,8 @@ static void uv__udp_run_pending(uv_udp_t* handle) { memset(&h, 0, sizeof h); h.msg_name = &req->addr; - h.msg_namelen = req->addrlen; + h.msg_namelen = (req->addr.sin6_family == AF_INET6 ? + sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)); h.msg_iov = (struct iovec*)req->bufs; h.msg_iovlen = req->bufcnt; @@ -415,8 +416,8 @@ static int uv__udp_send(uv_udp_send_t* req, uv__req_init(handle->loop, req, UV_UDP_SEND); + assert(addrlen <= sizeof(req->addr)); memcpy(&req->addr, addr, addrlen); - req->addrlen = addrlen; req->send_cb = send_cb; req->handle = handle; req->bufcnt = bufcnt; diff --git a/test/benchmark-sizes.c b/test/benchmark-sizes.c index 09e06e8f..6d16e3ca 100644 --- a/test/benchmark-sizes.c +++ b/test/benchmark-sizes.c @@ -27,6 +27,7 @@ BENCHMARK_IMPL(sizes) { LOGF("uv_shutdown_t: %u bytes\n", (unsigned int) sizeof(uv_shutdown_t)); LOGF("uv_write_t: %u bytes\n", (unsigned int) sizeof(uv_write_t)); LOGF("uv_connect_t: %u bytes\n", (unsigned int) sizeof(uv_connect_t)); + LOGF("uv_udp_send_t: %u bytes\n", (unsigned int) sizeof(uv_udp_send_t)); LOGF("uv_tcp_t: %u bytes\n", (unsigned int) sizeof(uv_tcp_t)); LOGF("uv_pipe_t: %u bytes\n", (unsigned int) sizeof(uv_pipe_t)); LOGF("uv_tty_t: %u bytes\n", (unsigned int) sizeof(uv_tty_t));