On Thu, Nov 11, 2010 at 11:48:32AM +0000, Richard Kenyon wrote: > Hi, I've written the following patch for NetSurf. > > This should replace 'bool url_host_is_ip_address(const char *host)' > in 'utils/url.c' >
see commit 10951 for my version (attached too) as the caller to this is exclusively in content/urldb.c which needs *extensive* fiddling to be made ipv6 capable right now I am punting the v6 decision untill later. -- Regards Vincent http://www.kyllikki.org/
Index: utils/url.c =================================================================== --- utils/url.c (revision 10950) +++ utils/url.c (working copy) @@ -77,39 +77,29 @@ /** - * Check whether a host is an IP address + * Check whether a host string is an IPv4 dotted quad address of the + * format XXX.XXX.XXX.XXX * - * \param host a hostname terminated by '\0' or '/' + * @todo This *should* be implemented with inet_pton but that requires + * implementing compatability glue for several operating systems. + * + * \param host a hostname terminated by '\0' or '/' * \return true if the hostname is an IP address, false otherwise */ bool url_host_is_ip_address(const char *host) { - int b; - bool n; + unsigned int b1, b2, b3, b4; + unsigned char c; - assert(host); + if (strspn(host, "0123456789.") < strlen(host)) + return false; - /* an IP address is of the format XXX.XXX.XXX.XXX, ie totally - * numeric with 3 full stops between the numbers */ - b = 0; // number of breaks - n = false; // number present - do { - if (*host == '.') { - if (!n) - return false; - b++; - n = false; - } else if ((*host == '\0') || (*host == '/')) { - if (!n) - return false; - /* todo: check the values are in 0-255 range */ - return (b == 3); - } else if (*host < '0' || *host > '9') { - return false; - } else { - n = true; - } - host++; - } while (1); + if (sscanf(host, "%3u.%3u.%3u.%3u%c", &b1, &b2, &b3, &b4, &c) != 4) + return false; + + if ((b1 > 255) || (b2 > 255) || (b3 > 255) || (b4 > 255)) + return false; + + return true; } /**