Date: Mon, 24 Jan 2011 13:00:23 GMT From: Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua> To: freebsd-net@FreeBSD.org Subject: Re: kern/92880: [libc] [patch] almost rewritten inet_network(3) function Message-ID: <201101241300.p0OD0Ndr000364@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/92880; it has been noted by GNATS. From: Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua> To: bug-followup@FreeBSD.org Cc: Subject: Re: kern/92880: [libc] [patch] almost rewritten inet_network(3) function Date: Mon, 24 Jan 2011 14:56:25 +0200 Since all '=' were changed to '=3D' in previous email, here is the copy of diff for the inet_network.c file. --- inet_network.c.orig 2008-01-15 00:55:20.000000000 +0200 +++ inet_network.c 2011-01-21 15:58:17.000000000 +0200 @@ -48,57 +48,56 @@ __FBSDID("$FreeBSD: src/lib/libc/inet/in * network numbers. */ in_addr_t -inet_network(cp) - const char *cp; +inet_network(const char *s) { - in_addr_t val, base, n; - char c; - in_addr_t parts[4], *pp = parts; - int i, digit; + u_int base, dots; + in_addr_t res, val; + u_char c; + char got_data; -again: - val = 0; base = 10; digit = 0; - if (*cp == '0') - digit = 1, base = 8, cp++; - if (*cp == 'x' || *cp == 'X') - base = 16, cp++; - while ((c = *cp) != 0) { - if (isdigit((unsigned char)c)) { - if (base == 8U && (c == '8' || c == '9')) + res = 0; + dots = 0; + for (;;) { + val = 0; + got_data = 0; + if (*s == '0') { + s++; + if (*s == 'x' || *s == 'X') { + s++; + base = 16; + } else { + base = 8; + got_data = 1; + } + } else + base = 10; + while ((c = *s) != '\0') { + if (isdigit(c)) { + if (base == 8 && c > '7') + return (INADDR_NONE); + val = val * base + c - '0'; + } else if (base == 16 && isxdigit(c)) + val = (val << 4) + c + 10 - + (islower(c) ? 'a' : 'A'); + else + break; + if (val > 0xff) return (INADDR_NONE); - val = (val * base) + (c - '0'); - cp++; - digit = 1; - continue; + s++; + got_data = 1; } - if (base == 16U && isxdigit((unsigned char)c)) { - val = (val << 4) + - (c + 10 - (islower((unsigned char)c) ? 'a' : 'A')); - cp++; - digit = 1; - continue; - } - break; - } - if (!digit) - return (INADDR_NONE); - if (pp >= parts + 4 || val > 0xffU) - return (INADDR_NONE); - if (*cp == '.') { - *pp++ = val, cp++; - goto again; - } - if (*cp && !isspace(*cp&0xff)) - return (INADDR_NONE); - *pp++ = val; - n = pp - parts; - if (n > 4U) - return (INADDR_NONE); - for (val = 0, i = 0; i < n; i++) { - val <<= 8; - val |= parts[i] & 0xff; + if (!got_data) + return (INADDR_NONE); + if (dots != 0) + res <<= 8; + res |= val; + if (c != '.') + break; + if (++dots == 4) + return (INADDR_NONE); + s++; } - return (val); + return (c == '\0' ? res : INADDR_NONE); } /*
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101241300.p0OD0Ndr000364>