From 645be48a804e1538d6058fa147d8786c49baf94b Mon Sep 17 00:00:00 2001 From: Ouyang Yadong Date: Fri, 27 Sep 2019 11:51:40 +0800 Subject: [PATCH] unix: set sin_len and sin6_len MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FreeBSD defines `sin_len` and `sin6_len` inside `sockaddr_in` and `sockaddr_in6`. `sockaddr`s come from `getsockname` and `uv_ip4_addr` will differ in the first byte if libuv doesn't set `sin_len` correctly. PR-URL: https://github.com/libuv/libuv/pull/2492 Reviewed-By: Anna Henningsen Reviewed-By: Santiago Gimeno Reviewed-By: Saúl Ibarra Corretgé --- src/uv-common.c | 3 +++ test/test-ip4-addr.c | 4 ++++ test/test-ip6-addr.c | 9 +++++++++ 3 files changed, 16 insertions(+) diff --git a/src/uv-common.c b/src/uv-common.c index 70db53ab..cec4ac62 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -211,6 +211,9 @@ int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr) { memset(addr, 0, sizeof(*addr)); addr->sin_family = AF_INET; addr->sin_port = htons(port); +#ifdef SIN6_LEN + addr->sin_len = sizeof(*addr); +#endif return uv_inet_pton(AF_INET, ip, &(addr->sin_addr.s_addr)); } diff --git a/test/test-ip4-addr.c b/test/test-ip4-addr.c index c72f36a6..dfefb0f9 100644 --- a/test/test-ip4-addr.c +++ b/test/test-ip4-addr.c @@ -42,6 +42,10 @@ TEST_IMPL(ip4_addr) { ASSERT(UV_EINVAL == uv_ip4_addr("2555.0.0.0", TEST_PORT, &addr)); ASSERT(UV_EINVAL == uv_ip4_addr("255", TEST_PORT, &addr)); +#ifdef SIN6_LEN + ASSERT(addr.sin_len == sizeof(addr)); +#endif + /* for broken address family */ ASSERT(UV_EAFNOSUPPORT == uv_inet_pton(42, "127.0.0.1", &addr.sin_addr.s_addr)); diff --git a/test/test-ip6-addr.c b/test/test-ip6-addr.c index bbf33a48..39d57065 100644 --- a/test/test-ip6-addr.c +++ b/test/test-ip6-addr.c @@ -160,3 +160,12 @@ TEST_IMPL(ip6_pton) { #undef GOOD_ADDR_LIST #undef BAD_ADDR_LIST + +#ifdef SIN6_LEN +TEST_IMPL(ip6_sin6_len) { + struct sockaddr_in6 s; + ASSERT(uv_ip6_addr("::", 0, &s) < 0); + ASSERT(s.sin6_len == sizeof(s)); + return 0; +} +#endif