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 '')
| -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); |
