1324c9471Sopenharmony_ciFrom f22cc01039b6473b736d3bf438f56a2654cdf2b2 Mon Sep 17 00:00:00 2001 2324c9471Sopenharmony_ciFrom: Brad House <brad@brad-house.com> 3324c9471Sopenharmony_ciDate: Mon, 22 May 2023 06:51:34 -0400 4324c9471Sopenharmony_ciSubject: [PATCH] Merge pull request from GHSA-x6mf-cxr9-8q6v 5324c9471Sopenharmony_ci 6324c9471Sopenharmony_ci* Merged latest OpenBSD changes for inet_net_pton_ipv6() into c-ares. 7324c9471Sopenharmony_ci* Always use our own IP conversion functions now, do not delegate to OS 8324c9471Sopenharmony_ci so we can have consistency in testing and fuzzing. 9324c9471Sopenharmony_ci* Removed bogus test cases that never should have passed. 10324c9471Sopenharmony_ci* Add new test case for crash bug found. 11324c9471Sopenharmony_ci 12324c9471Sopenharmony_ciFix By: Brad House (@bradh352) 13324c9471Sopenharmony_ci--- 14324c9471Sopenharmony_ci src/lib/inet_net_pton.c | 155 ++++++++++++++++++++----------------- 15324c9471Sopenharmony_ci test/ares-test-internal.cc | 7 +- 16324c9471Sopenharmony_ci 2 files changed, 86 insertions(+), 76 deletions(-) 17324c9471Sopenharmony_ci 18324c9471Sopenharmony_cidiff --git a/src/lib/inet_net_pton.c b/src/lib/inet_net_pton.c 19324c9471Sopenharmony_ciindex 840de50..fc50425 100644 20324c9471Sopenharmony_ci--- a/src/lib/inet_net_pton.c 21324c9471Sopenharmony_ci+++ b/src/lib/inet_net_pton.c 22324c9471Sopenharmony_ci@@ -1,19 +1,20 @@ 23324c9471Sopenharmony_ci 24324c9471Sopenharmony_ci /* 25324c9471Sopenharmony_ci- * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 26324c9471Sopenharmony_ci+ * Copyright (c) 2012 by Gilles Chehade <gilles@openbsd.org> 27324c9471Sopenharmony_ci * Copyright (c) 1996,1999 by Internet Software Consortium. 28324c9471Sopenharmony_ci * 29324c9471Sopenharmony_ci * Permission to use, copy, modify, and distribute this software for any 30324c9471Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above 31324c9471Sopenharmony_ci * copyright notice and this permission notice appear in all copies. 32324c9471Sopenharmony_ci * 33324c9471Sopenharmony_ci- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 34324c9471Sopenharmony_ci- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 35324c9471Sopenharmony_ci- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 36324c9471Sopenharmony_ci- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 37324c9471Sopenharmony_ci- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 38324c9471Sopenharmony_ci- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 39324c9471Sopenharmony_ci- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 40324c9471Sopenharmony_ci+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 41324c9471Sopenharmony_ci+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 42324c9471Sopenharmony_ci+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 43324c9471Sopenharmony_ci+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 44324c9471Sopenharmony_ci+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 45324c9471Sopenharmony_ci+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 46324c9471Sopenharmony_ci+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 47324c9471Sopenharmony_ci+ * SOFTWARE. 48324c9471Sopenharmony_ci */ 49324c9471Sopenharmony_ci 50324c9471Sopenharmony_ci #include "ares_setup.h" 51324c9471Sopenharmony_ci@@ -35,9 +36,6 @@ 52324c9471Sopenharmony_ci 53324c9471Sopenharmony_ci const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }; 54324c9471Sopenharmony_ci 55324c9471Sopenharmony_ci- 56324c9471Sopenharmony_ci-#ifndef HAVE_INET_NET_PTON 57324c9471Sopenharmony_ci- 58324c9471Sopenharmony_ci /* 59324c9471Sopenharmony_ci * static int 60324c9471Sopenharmony_ci * inet_net_pton_ipv4(src, dst, size) 61324c9471Sopenharmony_ci@@ -60,7 +58,7 @@ const struct ares_in6_addr ares_in6addr_any = { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0, 62324c9471Sopenharmony_ci * Paul Vixie (ISC), June 1996 63324c9471Sopenharmony_ci */ 64324c9471Sopenharmony_ci static int 65324c9471Sopenharmony_ci-inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) 66324c9471Sopenharmony_ci+ares_inet_net_pton_ipv4(const char *src, unsigned char *dst, size_t size) 67324c9471Sopenharmony_ci { 68324c9471Sopenharmony_ci static const char xdigits[] = "0123456789abcdef"; 69324c9471Sopenharmony_ci static const char digits[] = "0123456789"; 70324c9471Sopenharmony_ci@@ -261,19 +259,14 @@ getv4(const char *src, unsigned char *dst, int *bitsp) 71324c9471Sopenharmony_ci } 72324c9471Sopenharmony_ci 73324c9471Sopenharmony_ci static int 74324c9471Sopenharmony_ci-inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) 75324c9471Sopenharmony_ci+ares_inet_pton6(const char *src, unsigned char *dst) 76324c9471Sopenharmony_ci { 77324c9471Sopenharmony_ci static const char xdigits_l[] = "0123456789abcdef", 78324c9471Sopenharmony_ci- xdigits_u[] = "0123456789ABCDEF"; 79324c9471Sopenharmony_ci+ xdigits_u[] = "0123456789ABCDEF"; 80324c9471Sopenharmony_ci unsigned char tmp[NS_IN6ADDRSZ], *tp, *endp, *colonp; 81324c9471Sopenharmony_ci const char *xdigits, *curtok; 82324c9471Sopenharmony_ci- int ch, saw_xdigit; 83324c9471Sopenharmony_ci+ int ch, saw_xdigit, count_xdigit; 84324c9471Sopenharmony_ci unsigned int val; 85324c9471Sopenharmony_ci- int digits; 86324c9471Sopenharmony_ci- int bits; 87324c9471Sopenharmony_ci- size_t bytes; 88324c9471Sopenharmony_ci- int words; 89324c9471Sopenharmony_ci- int ipv4; 90324c9471Sopenharmony_ci 91324c9471Sopenharmony_ci memset((tp = tmp), '\0', NS_IN6ADDRSZ); 92324c9471Sopenharmony_ci endp = tp + NS_IN6ADDRSZ; 93324c9471Sopenharmony_ci@@ -283,22 +276,22 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) 94324c9471Sopenharmony_ci if (*++src != ':') 95324c9471Sopenharmony_ci goto enoent; 96324c9471Sopenharmony_ci curtok = src; 97324c9471Sopenharmony_ci- saw_xdigit = 0; 98324c9471Sopenharmony_ci+ saw_xdigit = count_xdigit = 0; 99324c9471Sopenharmony_ci val = 0; 100324c9471Sopenharmony_ci- digits = 0; 101324c9471Sopenharmony_ci- bits = -1; 102324c9471Sopenharmony_ci- ipv4 = 0; 103324c9471Sopenharmony_ci while ((ch = *src++) != '\0') { 104324c9471Sopenharmony_ci const char *pch; 105324c9471Sopenharmony_ci 106324c9471Sopenharmony_ci if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) 107324c9471Sopenharmony_ci pch = strchr((xdigits = xdigits_u), ch); 108324c9471Sopenharmony_ci if (pch != NULL) { 109324c9471Sopenharmony_ci+ if (count_xdigit >= 4) 110324c9471Sopenharmony_ci+ goto enoent; 111324c9471Sopenharmony_ci val <<= 4; 112324c9471Sopenharmony_ci- val |= aresx_sztoui(pch - xdigits); 113324c9471Sopenharmony_ci- if (++digits > 4) 114324c9471Sopenharmony_ci+ val |= (pch - xdigits); 115324c9471Sopenharmony_ci+ if (val > 0xffff) 116324c9471Sopenharmony_ci goto enoent; 117324c9471Sopenharmony_ci saw_xdigit = 1; 118324c9471Sopenharmony_ci+ count_xdigit++; 119324c9471Sopenharmony_ci continue; 120324c9471Sopenharmony_ci } 121324c9471Sopenharmony_ci if (ch == ':') { 122324c9471Sopenharmony_ci@@ -308,78 +301,107 @@ inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) 123324c9471Sopenharmony_ci goto enoent; 124324c9471Sopenharmony_ci colonp = tp; 125324c9471Sopenharmony_ci continue; 126324c9471Sopenharmony_ci- } else if (*src == '\0') 127324c9471Sopenharmony_ci+ } else if (*src == '\0') { 128324c9471Sopenharmony_ci goto enoent; 129324c9471Sopenharmony_ci+ } 130324c9471Sopenharmony_ci if (tp + NS_INT16SZ > endp) 131324c9471Sopenharmony_ci- return (0); 132324c9471Sopenharmony_ci- *tp++ = (unsigned char)((val >> 8) & 0xff); 133324c9471Sopenharmony_ci- *tp++ = (unsigned char)(val & 0xff); 134324c9471Sopenharmony_ci+ goto enoent; 135324c9471Sopenharmony_ci+ *tp++ = (unsigned char) (val >> 8) & 0xff; 136324c9471Sopenharmony_ci+ *tp++ = (unsigned char) val & 0xff; 137324c9471Sopenharmony_ci saw_xdigit = 0; 138324c9471Sopenharmony_ci- digits = 0; 139324c9471Sopenharmony_ci+ count_xdigit = 0; 140324c9471Sopenharmony_ci val = 0; 141324c9471Sopenharmony_ci continue; 142324c9471Sopenharmony_ci } 143324c9471Sopenharmony_ci if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && 144324c9471Sopenharmony_ci- getv4(curtok, tp, &bits) > 0) { 145324c9471Sopenharmony_ci- tp += NS_INADDRSZ; 146324c9471Sopenharmony_ci+ ares_inet_net_pton_ipv4(curtok, tp, INADDRSZ) > 0) { 147324c9471Sopenharmony_ci+ tp += INADDRSZ; 148324c9471Sopenharmony_ci saw_xdigit = 0; 149324c9471Sopenharmony_ci- ipv4 = 1; 150324c9471Sopenharmony_ci+ count_xdigit = 0; 151324c9471Sopenharmony_ci break; /* '\0' was seen by inet_pton4(). */ 152324c9471Sopenharmony_ci } 153324c9471Sopenharmony_ci- if (ch == '/' && getbits(src, &bits) > 0) 154324c9471Sopenharmony_ci- break; 155324c9471Sopenharmony_ci goto enoent; 156324c9471Sopenharmony_ci } 157324c9471Sopenharmony_ci if (saw_xdigit) { 158324c9471Sopenharmony_ci if (tp + NS_INT16SZ > endp) 159324c9471Sopenharmony_ci goto enoent; 160324c9471Sopenharmony_ci- *tp++ = (unsigned char)((val >> 8) & 0xff); 161324c9471Sopenharmony_ci- *tp++ = (unsigned char)(val & 0xff); 162324c9471Sopenharmony_ci+ *tp++ = (unsigned char) (val >> 8) & 0xff; 163324c9471Sopenharmony_ci+ *tp++ = (unsigned char) val & 0xff; 164324c9471Sopenharmony_ci } 165324c9471Sopenharmony_ci- if (bits == -1) 166324c9471Sopenharmony_ci- bits = 128; 167324c9471Sopenharmony_ci- 168324c9471Sopenharmony_ci- words = (bits + 15) / 16; 169324c9471Sopenharmony_ci- if (words < 2) 170324c9471Sopenharmony_ci- words = 2; 171324c9471Sopenharmony_ci- if (ipv4) 172324c9471Sopenharmony_ci- words = 8; 173324c9471Sopenharmony_ci- endp = tmp + 2 * words; 174324c9471Sopenharmony_ci- 175324c9471Sopenharmony_ci if (colonp != NULL) { 176324c9471Sopenharmony_ci /* 177324c9471Sopenharmony_ci * Since some memmove()'s erroneously fail to handle 178324c9471Sopenharmony_ci * overlapping regions, we'll do the shift by hand. 179324c9471Sopenharmony_ci */ 180324c9471Sopenharmony_ci- const ares_ssize_t n = tp - colonp; 181324c9471Sopenharmony_ci- ares_ssize_t i; 182324c9471Sopenharmony_ci+ const int n = tp - colonp; 183324c9471Sopenharmony_ci+ int i; 184324c9471Sopenharmony_ci 185324c9471Sopenharmony_ci if (tp == endp) 186324c9471Sopenharmony_ci goto enoent; 187324c9471Sopenharmony_ci for (i = 1; i <= n; i++) { 188324c9471Sopenharmony_ci- *(endp - i) = *(colonp + n - i); 189324c9471Sopenharmony_ci- *(colonp + n - i) = 0; 190324c9471Sopenharmony_ci+ endp[- i] = colonp[n - i]; 191324c9471Sopenharmony_ci+ colonp[n - i] = 0; 192324c9471Sopenharmony_ci } 193324c9471Sopenharmony_ci tp = endp; 194324c9471Sopenharmony_ci } 195324c9471Sopenharmony_ci if (tp != endp) 196324c9471Sopenharmony_ci goto enoent; 197324c9471Sopenharmony_ci 198324c9471Sopenharmony_ci- bytes = (bits + 7) / 8; 199324c9471Sopenharmony_ci- if (bytes > size) 200324c9471Sopenharmony_ci- goto emsgsize; 201324c9471Sopenharmony_ci- memcpy(dst, tmp, bytes); 202324c9471Sopenharmony_ci- return (bits); 203324c9471Sopenharmony_ci+ memcpy(dst, tmp, NS_IN6ADDRSZ); 204324c9471Sopenharmony_ci+ return (1); 205324c9471Sopenharmony_ci 206324c9471Sopenharmony_ci- enoent: 207324c9471Sopenharmony_ci+enoent: 208324c9471Sopenharmony_ci SET_ERRNO(ENOENT); 209324c9471Sopenharmony_ci return (-1); 210324c9471Sopenharmony_ci 211324c9471Sopenharmony_ci- emsgsize: 212324c9471Sopenharmony_ci+emsgsize: 213324c9471Sopenharmony_ci SET_ERRNO(EMSGSIZE); 214324c9471Sopenharmony_ci return (-1); 215324c9471Sopenharmony_ci } 216324c9471Sopenharmony_ci 217324c9471Sopenharmony_ci+static int 218324c9471Sopenharmony_ci+ares_inet_net_pton_ipv6(const char *src, unsigned char *dst, size_t size) 219324c9471Sopenharmony_ci+{ 220324c9471Sopenharmony_ci+ struct ares_in6_addr in6; 221324c9471Sopenharmony_ci+ int ret; 222324c9471Sopenharmony_ci+ int bits; 223324c9471Sopenharmony_ci+ size_t bytes; 224324c9471Sopenharmony_ci+ char buf[INET6_ADDRSTRLEN + sizeof("/128")]; 225324c9471Sopenharmony_ci+ char *sep; 226324c9471Sopenharmony_ci+ const char *errstr; 227324c9471Sopenharmony_ci+ 228324c9471Sopenharmony_ci+ if (strlen(src) >= sizeof buf) { 229324c9471Sopenharmony_ci+ SET_ERRNO(EMSGSIZE); 230324c9471Sopenharmony_ci+ return (-1); 231324c9471Sopenharmony_ci+ } 232324c9471Sopenharmony_ci+ strncpy(buf, src, sizeof buf); 233324c9471Sopenharmony_ci+ 234324c9471Sopenharmony_ci+ sep = strchr(buf, '/'); 235324c9471Sopenharmony_ci+ if (sep != NULL) 236324c9471Sopenharmony_ci+ *sep++ = '\0'; 237324c9471Sopenharmony_ci+ 238324c9471Sopenharmony_ci+ ret = ares_inet_pton6(buf, (unsigned char *)&in6); 239324c9471Sopenharmony_ci+ if (ret != 1) 240324c9471Sopenharmony_ci+ return (-1); 241324c9471Sopenharmony_ci+ 242324c9471Sopenharmony_ci+ if (sep == NULL) 243324c9471Sopenharmony_ci+ bits = 128; 244324c9471Sopenharmony_ci+ else { 245324c9471Sopenharmony_ci+ if (!getbits(sep, &bits)) { 246324c9471Sopenharmony_ci+ SET_ERRNO(ENOENT); 247324c9471Sopenharmony_ci+ return (-1); 248324c9471Sopenharmony_ci+ } 249324c9471Sopenharmony_ci+ } 250324c9471Sopenharmony_ci+ 251324c9471Sopenharmony_ci+ bytes = (bits + 7) / 8; 252324c9471Sopenharmony_ci+ if (bytes > size) { 253324c9471Sopenharmony_ci+ SET_ERRNO(EMSGSIZE); 254324c9471Sopenharmony_ci+ return (-1); 255324c9471Sopenharmony_ci+ } 256324c9471Sopenharmony_ci+ memcpy(dst, &in6, bytes); 257324c9471Sopenharmony_ci+ return (bits); 258324c9471Sopenharmony_ci+} 259324c9471Sopenharmony_ci+ 260324c9471Sopenharmony_ci /* 261324c9471Sopenharmony_ci * int 262324c9471Sopenharmony_ci * inet_net_pton(af, src, dst, size) 263324c9471Sopenharmony_ci@@ -403,18 +425,15 @@ ares_inet_net_pton(int af, const char *src, void *dst, size_t size) 264324c9471Sopenharmony_ci { 265324c9471Sopenharmony_ci switch (af) { 266324c9471Sopenharmony_ci case AF_INET: 267324c9471Sopenharmony_ci- return (inet_net_pton_ipv4(src, dst, size)); 268324c9471Sopenharmony_ci+ return (ares_inet_net_pton_ipv4(src, dst, size)); 269324c9471Sopenharmony_ci case AF_INET6: 270324c9471Sopenharmony_ci- return (inet_net_pton_ipv6(src, dst, size)); 271324c9471Sopenharmony_ci+ return (ares_inet_net_pton_ipv6(src, dst, size)); 272324c9471Sopenharmony_ci default: 273324c9471Sopenharmony_ci SET_ERRNO(EAFNOSUPPORT); 274324c9471Sopenharmony_ci return (-1); 275324c9471Sopenharmony_ci } 276324c9471Sopenharmony_ci } 277324c9471Sopenharmony_ci 278324c9471Sopenharmony_ci-#endif /* HAVE_INET_NET_PTON */ 279324c9471Sopenharmony_ci- 280324c9471Sopenharmony_ci-#ifndef HAVE_INET_PTON 281324c9471Sopenharmony_ci int ares_inet_pton(int af, const char *src, void *dst) 282324c9471Sopenharmony_ci { 283324c9471Sopenharmony_ci int result; 284324c9471Sopenharmony_ci@@ -434,11 +453,3 @@ int ares_inet_pton(int af, const char *src, void *dst) 285324c9471Sopenharmony_ci return 0; 286324c9471Sopenharmony_ci return (result > -1 ? 1 : -1); 287324c9471Sopenharmony_ci } 288324c9471Sopenharmony_ci-#else /* HAVE_INET_PTON */ 289324c9471Sopenharmony_ci-int ares_inet_pton(int af, const char *src, void *dst) 290324c9471Sopenharmony_ci-{ 291324c9471Sopenharmony_ci- /* just relay this to the underlying function */ 292324c9471Sopenharmony_ci- return inet_pton(af, src, dst); 293324c9471Sopenharmony_ci-} 294324c9471Sopenharmony_ci- 295324c9471Sopenharmony_ci-#endif 296324c9471Sopenharmony_cidiff --git a/test/ares-test-internal.cc b/test/ares-test-internal.cc 297324c9471Sopenharmony_ciindex 1cb7e42..40cc82b 100644 298324c9471Sopenharmony_ci--- a/test/ares-test-internal.cc 299324c9471Sopenharmony_ci+++ b/test/ares-test-internal.cc 300324c9471Sopenharmony_ci@@ -123,6 +123,7 @@ TEST_F(LibraryTest, InetPtoN) { 301324c9471Sopenharmony_ci EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "12:34::ff/0", &a6, sizeof(a6))); 302324c9471Sopenharmony_ci EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "12:34::ffff:0.2", &a6, sizeof(a6))); 303324c9471Sopenharmony_ci EXPECT_EQ(16 * 8, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6))); 304324c9471Sopenharmony_ci+ EXPECT_EQ(2, ares_inet_net_pton(AF_INET6, "0::00:00:00/2", &a6, sizeof(a6))); 305324c9471Sopenharmony_ci 306324c9471Sopenharmony_ci // Various malformed versions 307324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET, "", &a4, sizeof(a4))); 308324c9471Sopenharmony_ci@@ -160,11 +161,9 @@ TEST_F(LibraryTest, InetPtoN) { 309324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234", &a6, sizeof(a6))); 310324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, ":1234:1234:1234:1234:1234:1234:1234:1234:", &a6, sizeof(a6))); 311324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678", &a6, sizeof(a6))); 312324c9471Sopenharmony_ci- // TODO(drysdale): check whether the next two tests should give -1. 313324c9471Sopenharmony_ci- EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678", &a6, sizeof(a6))); 314324c9471Sopenharmony_ci- EXPECT_EQ(0, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678:5678", &a6, sizeof(a6))); 315324c9471Sopenharmony_ci+ EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678", &a6, sizeof(a6))); 316324c9471Sopenharmony_ci+ EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "1234:1234:1234:1234:1234:1234:1234:1234:5678:5678:5678", &a6, sizeof(a6))); 317324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:257.2.3.4", &a6, sizeof(a6))); 318324c9471Sopenharmony_ci- EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:002.2.3.4", &a6, sizeof(a6))); 319324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5.6", &a6, sizeof(a6))); 320324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.4.5", &a6, sizeof(a6))); 321324c9471Sopenharmony_ci EXPECT_EQ(-1, ares_inet_net_pton(AF_INET6, "12:34::ffff:1.2.3.z", &a6, sizeof(a6))); 322324c9471Sopenharmony_ci-- 323324c9471Sopenharmony_ci2.27.0 324324c9471Sopenharmony_ci 325