diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-01-31 08:22:01 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-01-31 08:22:01 +0000 |
commit | 613444ea7cee5badcf057b93e896b51e9cb74c0a (patch) | |
tree | c36907057166403e292c153f14bd4dd9b2c64fd3 /inet | |
parent | 8a94dfe44e23e89b366019c9b4cad1a3cc1d853b (diff) | |
download | glibc-613444ea7cee5badcf057b93e896b51e9cb74c0a.zip glibc-613444ea7cee5badcf057b93e896b51e9cb74c0a.tar.gz glibc-613444ea7cee5badcf057b93e896b51e9cb74c0a.tar.bz2 |
(inet_network): Synch with bind 8.2.2.
Diffstat (limited to 'inet')
-rw-r--r-- | inet/inet_net.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/inet/inet_net.c b/inet/inet_net.c index 532d821..cdc4d9d 100644 --- a/inet/inet_net.c +++ b/inet/inet_net.c @@ -48,28 +48,35 @@ inet_network(cp) register u_int32_t val, base, n, i; register char c; u_int32_t parts[4], *pp = parts; + int digit; again: - val = 0; base = 10; + val = 0; base = 10; digit = 0; if (*cp == '0') - base = 8, cp++; + digit = 1, base = 8, cp++; if (*cp == 'x' || *cp == 'X') base = 16, cp++; - while ((c = *cp)) { + while ((c = *cp) != 0) { if (isdigit(c)) { + if (base == 8 && (c == '8' || c == '9')) + return (INADDR_NONE); val = (val * base) + (c - '0'); cp++; + digit = 1; continue; } if (base == 16 && isxdigit(c)) { val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); cp++; + digit = 1; continue; } break; } + if (!digit) + return (INADDR_NONE); if (*cp == '.') { - if (pp >= parts + 4) + if (pp >= parts + 4 || val > 0xff) return (INADDR_NONE); *pp++ = val, cp++; goto again; |