From d6e7f8ee836c92e64b4ac08b37cf5e997c0825fd Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Thu, 4 Dec 2025 12:18:45 -0300 Subject: [PATCH] fix mg_aton not setting is_ip6 with scope_ids --- mongoose.c | 11 ++++++++--- src/net.c | 11 ++++++++--- test/unit_test.c | 8 ++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/mongoose.c b/mongoose.c index c577088f..1ef80b22 100644 --- a/mongoose.c +++ b/mongoose.c @@ -4162,7 +4162,7 @@ static bool mg_aton6(struct mg_str str, struct mg_addr *addr) { size_t i, j = 0, n = 0, dc = 42; addr->scope_id = 0; if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2; - if (mg_v4mapped(str, addr)) return true; + if (mg_v4mapped(str, addr)) return true; // sets addr->is_ip6 for (i = 0; i < str.len; i++) { if ((str.buf[i] >= '0' && str.buf[i] <= '9') || (str.buf[i] >= 'a' && str.buf[i] <= 'f') || @@ -4184,8 +4184,13 @@ static bool mg_aton6(struct mg_str str, struct mg_addr *addr) { if (n > 14) return false; addr->ip[n] = addr->ip[n + 1] = 0; // For trailing :: } else if (str.buf[i] == '%') { // Scope ID, last in string - return mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10, - &addr->scope_id, sizeof(uint8_t)); + if (mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10, + &addr->scope_id, sizeof(uint8_t))) { + addr->is_ip6 = true; + return true; + } else { + return false; + } } else { return false; } diff --git a/src/net.c b/src/net.c index 4d6bfeeb..50231335 100644 --- a/src/net.c +++ b/src/net.c @@ -86,7 +86,7 @@ static bool mg_aton6(struct mg_str str, struct mg_addr *addr) { size_t i, j = 0, n = 0, dc = 42; addr->scope_id = 0; if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2; - if (mg_v4mapped(str, addr)) return true; + if (mg_v4mapped(str, addr)) return true; // sets addr->is_ip6 for (i = 0; i < str.len; i++) { if ((str.buf[i] >= '0' && str.buf[i] <= '9') || (str.buf[i] >= 'a' && str.buf[i] <= 'f') || @@ -108,8 +108,13 @@ static bool mg_aton6(struct mg_str str, struct mg_addr *addr) { if (n > 14) return false; addr->ip[n] = addr->ip[n + 1] = 0; // For trailing :: } else if (str.buf[i] == '%') { // Scope ID, last in string - return mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10, - &addr->scope_id, sizeof(uint8_t)); + if (mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10, + &addr->scope_id, sizeof(uint8_t))) { + addr->is_ip6 = true; + return true; + } else { + return false; + } } else { return false; } diff --git a/test/unit_test.c b/test/unit_test.c index 52632595..bc5267ad 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -2717,22 +2717,22 @@ static void test_util(void) { ASSERT(mg_url_decode("a=%123", 6, buf, sizeof(buf), 0) == 4 && buf[2] == 0x12 && buf[3] == '3'); - memset(a.ip, 0xaa, sizeof(a.ip)); + memset(&a, 0, sizeof(a)); ASSERT(mg_aton(mg_str("::1%1"), &a) == true); ASSERT(a.is_ip6 == true); ASSERT(a.scope_id == 1); - memset(a.ip, 0xaa, sizeof(a.ip)); + memset(&a, 0, sizeof(a)); ASSERT(mg_aton(mg_str("abcd::aabb:ccdd%17"), &a) == true); ASSERT(a.is_ip6 == true); ASSERT(a.scope_id == 17); - memset(a.ip, 0xaa, sizeof(a.ip)); + memset(&a, 0xaa, sizeof(a)), a.is_ip6 = false; ASSERT(mg_aton(mg_str("::1%17"), &a) == true); ASSERT(a.is_ip6 == true); ASSERT(a.scope_id == 17); - memset(a.ip, 0xaa, sizeof(a.ip)); + memset(&a, 0xaa, sizeof(a)), a.is_ip6 = false; ASSERT(mg_aton(mg_str("::1%255"), &a) == true); ASSERT(a.is_ip6 == true); ASSERT(a.scope_id == 255);