summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoritojun <>2006-12-30 23:37:37 +0000
committeritojun <>2006-12-30 23:37:37 +0000
commit39d41d2dddc46b74772e1be62786fdb9ea23cd74 (patch)
treeb4fbb139dd47ba297d0537ad2539c5f904a272dc /src
parentc637dfc67372c7d04a8e0cc2bca4a0f242573541 (diff)
downloadopenbsd-39d41d2dddc46b74772e1be62786fdb9ea23cd74.tar.gz
openbsd-39d41d2dddc46b74772e1be62786fdb9ea23cd74.tar.bz2
openbsd-39d41d2dddc46b74772e1be62786fdb9ea23cd74.zip
RFC4291 declares that IPv6 numeric representation must have no more than
4 hex digits between colons. deraadt ok
Diffstat (limited to 'src')
-rw-r--r--src/lib/libc/net/inet_pton.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/lib/libc/net/inet_pton.c b/src/lib/libc/net/inet_pton.c
index 87206ee8b8..096ff65772 100644
--- a/src/lib/libc/net/inet_pton.c
+++ b/src/lib/libc/net/inet_pton.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: inet_pton.c,v 1.6 2005/08/06 20:30:03 espie Exp $ */ 1/* $OpenBSD: inet_pton.c,v 1.7 2006/12/30 23:37:37 itojun Exp $ */
2 2
3/* Copyright (c) 1996 by Internet Software Consortium. 3/* Copyright (c) 1996 by Internet Software Consortium.
4 * 4 *
@@ -128,7 +128,7 @@ inet_pton6(const char *src, u_char *dst)
128 xdigits_u[] = "0123456789ABCDEF"; 128 xdigits_u[] = "0123456789ABCDEF";
129 u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp; 129 u_char tmp[IN6ADDRSZ], *tp, *endp, *colonp;
130 const char *xdigits, *curtok; 130 const char *xdigits, *curtok;
131 int ch, saw_xdigit; 131 int ch, saw_xdigit, count_xdigit;
132 u_int val; 132 u_int val;
133 133
134 memset((tp = tmp), '\0', IN6ADDRSZ); 134 memset((tp = tmp), '\0', IN6ADDRSZ);
@@ -139,7 +139,7 @@ inet_pton6(const char *src, u_char *dst)
139 if (*++src != ':') 139 if (*++src != ':')
140 return (0); 140 return (0);
141 curtok = src; 141 curtok = src;
142 saw_xdigit = 0; 142 saw_xdigit = count_xdigit = 0;
143 val = 0; 143 val = 0;
144 while ((ch = *src++) != '\0') { 144 while ((ch = *src++) != '\0') {
145 const char *pch; 145 const char *pch;
@@ -147,11 +147,14 @@ inet_pton6(const char *src, u_char *dst)
147 if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) 147 if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)
148 pch = strchr((xdigits = xdigits_u), ch); 148 pch = strchr((xdigits = xdigits_u), ch);
149 if (pch != NULL) { 149 if (pch != NULL) {
150 if (count_xdigit >= 4)
151 return (0);
150 val <<= 4; 152 val <<= 4;
151 val |= (pch - xdigits); 153 val |= (pch - xdigits);
152 if (val > 0xffff) 154 if (val > 0xffff)
153 return (0); 155 return (0);
154 saw_xdigit = 1; 156 saw_xdigit = 1;
157 count_xdigit++;
155 continue; 158 continue;
156 } 159 }
157 if (ch == ':') { 160 if (ch == ':') {
@@ -169,6 +172,7 @@ inet_pton6(const char *src, u_char *dst)
169 *tp++ = (u_char) (val >> 8) & 0xff; 172 *tp++ = (u_char) (val >> 8) & 0xff;
170 *tp++ = (u_char) val & 0xff; 173 *tp++ = (u_char) val & 0xff;
171 saw_xdigit = 0; 174 saw_xdigit = 0;
175 count_xdigit = 0;
172 val = 0; 176 val = 0;
173 continue; 177 continue;
174 } 178 }
@@ -176,6 +180,7 @@ inet_pton6(const char *src, u_char *dst)
176 inet_pton4(curtok, tp) > 0) { 180 inet_pton4(curtok, tp) > 0) {
177 tp += INADDRSZ; 181 tp += INADDRSZ;
178 saw_xdigit = 0; 182 saw_xdigit = 0;
183 count_xdigit = 0;
179 break; /* '\0' was seen by inet_pton4(). */ 184 break; /* '\0' was seen by inet_pton4(). */
180 } 185 }
181 return (0); 186 return (0);