mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-05 22:29:49 +00:00
fix ip6addr_aton for non-shortened ipv4 mapped addresses
This commit is contained in:
parent
eb91fdd861
commit
0c5133d7cf
@ -82,7 +82,7 @@ ip6addr_aton(const char *cp, ip6_addr_t *addr)
|
|||||||
zero_blocks--;
|
zero_blocks--;
|
||||||
#if LWIP_IPV4
|
#if LWIP_IPV4
|
||||||
} else if (*s == '.') {
|
} else if (*s == '.') {
|
||||||
if (zero_blocks == 5) {
|
if ((zero_blocks == 5) ||(zero_blocks == 2)) {
|
||||||
check_ipv4_mapped = 1;
|
check_ipv4_mapped = 1;
|
||||||
/* last block could be the start of an IPv4 address */
|
/* last block could be the start of an IPv4 address */
|
||||||
zero_blocks--;
|
zero_blocks--;
|
||||||
|
@ -156,46 +156,60 @@ START_TEST(test_ip6_aton_ipv4mapped)
|
|||||||
ip_addr_t addr;
|
ip_addr_t addr;
|
||||||
ip6_addr_t addr6;
|
ip6_addr_t addr6;
|
||||||
const ip_addr_t addr_expected = IPADDR6_INIT_HOST(0, 0, 0xFFFF, 0xD4CC65D2);
|
const ip_addr_t addr_expected = IPADDR6_INIT_HOST(0, 0, 0xFFFF, 0xD4CC65D2);
|
||||||
|
const char *full_ipv6_addr = "0:0:0:0:0:FFFF:D4CC:65D2";
|
||||||
|
const char *shortened_ipv6_addr = "::FFFF:D4CC:65D2";
|
||||||
|
const char *full_ipv4_mapped_addr = "0:0:0:0:0:FFFF:212.204.101.210";
|
||||||
|
const char *shortened_ipv4_mapped_addr = "::FFFF:212.204.101.210";
|
||||||
|
const char *bogus_ipv4_mapped_addr = "::FFFF:212.204.101.2101";
|
||||||
LWIP_UNUSED_ARG(_i);
|
LWIP_UNUSED_ARG(_i);
|
||||||
|
|
||||||
/* check IPv6 representation */
|
/* check IPv6 representation */
|
||||||
memset(&addr6, 0, sizeof(addr6));
|
memset(&addr6, 0, sizeof(addr6));
|
||||||
ret = ip6addr_aton("0:0:0:0:0:FFFF:D4CC:65D2", &addr6);
|
ret = ip6addr_aton(full_ipv6_addr, &addr6);
|
||||||
fail_unless(ret == 1);
|
fail_unless(ret == 1);
|
||||||
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
ret = ipaddr_aton("0:0:0:0:0:FFFF:D4CC:65D2", &addr);
|
ret = ipaddr_aton(full_ipv6_addr, &addr);
|
||||||
fail_unless(ret == 1);
|
fail_unless(ret == 1);
|
||||||
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
||||||
|
|
||||||
/* check shortened IPv6 representation */
|
/* check shortened IPv6 representation */
|
||||||
memset(&addr6, 0, sizeof(addr6));
|
memset(&addr6, 0, sizeof(addr6));
|
||||||
ret = ip6addr_aton("::FFFF:D4CC:65D2", &addr6);
|
ret = ip6addr_aton(shortened_ipv6_addr, &addr6);
|
||||||
fail_unless(ret == 1);
|
fail_unless(ret == 1);
|
||||||
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
ret = ipaddr_aton("::FFFF:D4CC:65D2", &addr);
|
ret = ipaddr_aton(shortened_ipv6_addr, &addr);
|
||||||
|
fail_unless(ret == 1);
|
||||||
|
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
||||||
|
|
||||||
|
/* checked shortened mixed representation */
|
||||||
|
memset(&addr6, 0, sizeof(addr6));
|
||||||
|
ret = ip6addr_aton(shortened_ipv4_mapped_addr, &addr6);
|
||||||
|
fail_unless(ret == 1);
|
||||||
|
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
||||||
|
memset(&addr, 0, sizeof(addr));
|
||||||
|
ret = ipaddr_aton(shortened_ipv4_mapped_addr, &addr);
|
||||||
fail_unless(ret == 1);
|
fail_unless(ret == 1);
|
||||||
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
||||||
|
|
||||||
/* checked mixed representation */
|
/* checked mixed representation */
|
||||||
memset(&addr6, 0, sizeof(addr6));
|
memset(&addr6, 0, sizeof(addr6));
|
||||||
ret = ip6addr_aton("::FFFF:212.204.101.210", &addr6);
|
ret = ip6addr_aton(full_ipv4_mapped_addr, &addr6);
|
||||||
fail_unless(ret == 1);
|
fail_unless(ret == 1);
|
||||||
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
fail_unless(memcmp(&addr6, &addr_expected, 16) == 0);
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
ret = ipaddr_aton("::FFFF:212.204.101.210", &addr);
|
ret = ipaddr_aton(full_ipv4_mapped_addr, &addr);
|
||||||
fail_unless(ret == 1);
|
fail_unless(ret == 1);
|
||||||
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
fail_unless(memcmp(&addr, &addr_expected, 16) == 0);
|
||||||
|
|
||||||
/* checked bogus mixed representation */
|
/* checked bogus mixed representation */
|
||||||
memset(&addr6, 0, sizeof(addr6));
|
memset(&addr6, 0, sizeof(addr6));
|
||||||
ret = ip6addr_aton("::FFFF:212.204.101.2101", &addr6);
|
ret = ip6addr_aton(bogus_ipv4_mapped_addr, &addr6);
|
||||||
fail_unless(ret == 0);
|
fail_unless(ret == 0);
|
||||||
memset(&addr, 0, sizeof(addr));
|
memset(&addr, 0, sizeof(addr));
|
||||||
ret = ipaddr_aton("::FFFF:212.204.101.2101", &addr);
|
ret = ipaddr_aton(bogus_ipv4_mapped_addr, &addr);
|
||||||
fail_unless(ret == 0);
|
fail_unless(ret == 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user