diff options
author | itojun <> | 2006-12-30 23:37:37 +0000 |
---|---|---|
committer | itojun <> | 2006-12-30 23:37:37 +0000 |
commit | 39d41d2dddc46b74772e1be62786fdb9ea23cd74 (patch) | |
tree | b4fbb139dd47ba297d0537ad2539c5f904a272dc /src | |
parent | c637dfc67372c7d04a8e0cc2bca4a0f242573541 (diff) | |
download | openbsd-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.c | 11 |
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); |