From 36549815eed297c74448ff580b5c84713245ec5d Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 12 May 2020 12:38:56 +0200 Subject: [PATCH] unix,win: fix wrong sizeof argument to memcpy() Libuv was copying `sizeof(struct sockaddr_storage)` bytes from source to destination but the source was only `sizeof(struct sockaddr_in6)` bytes big, or approximately 128 vs. 16 bytes. Fixes: https://github.com/libuv/libuv/issues/2840 PR-URL: https://github.com/libuv/libuv/pull/2841 Reviewed-By: Colin Ihrig Reviewed-By: Santiago Gimeno --- src/unix/udp.c | 6 ++++-- src/win/udp.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/unix/udp.c b/src/unix/udp.c index 1d9ee9224..7cf80ef3b 100644 --- a/src/unix/udp.c +++ b/src/unix/udp.c @@ -925,8 +925,10 @@ static int uv__udp_set_source_membership6(uv_udp_t* handle, mreq.gsr_interface = 0; } - memcpy(&mreq.gsr_group, multicast_addr, sizeof(mreq.gsr_group)); - memcpy(&mreq.gsr_source, source_addr, sizeof(mreq.gsr_source)); + STATIC_ASSERT(sizeof(mreq.gsr_group) >= sizeof(*multicast_addr)); + STATIC_ASSERT(sizeof(mreq.gsr_source) >= sizeof(*source_addr)); + memcpy(&mreq.gsr_group, multicast_addr, sizeof(*multicast_addr)); + memcpy(&mreq.gsr_source, source_addr, sizeof(*source_addr)); if (membership == UV_JOIN_GROUP) optname = MCAST_JOIN_SOURCE_GROUP; diff --git a/src/win/udp.c b/src/win/udp.c index 508ed37fb..1c4977af9 100644 --- a/src/win/udp.c +++ b/src/win/udp.c @@ -774,8 +774,10 @@ int uv__udp_set_source_membership6(uv_udp_t* handle, mreq.gsr_interface = 0; } - memcpy(&mreq.gsr_group, multicast_addr, sizeof(mreq.gsr_group)); - memcpy(&mreq.gsr_source, source_addr, sizeof(mreq.gsr_source)); + STATIC_ASSERT(sizeof(mreq.gsr_group) >= sizeof(*multicast_addr)); + STATIC_ASSERT(sizeof(mreq.gsr_source) >= sizeof(*source_addr)); + memcpy(&mreq.gsr_group, multicast_addr, sizeof(*multicast_addr)); + memcpy(&mreq.gsr_source, source_addr, sizeof(*source_addr)); if (membership == UV_JOIN_GROUP) optname = MCAST_JOIN_SOURCE_GROUP;