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