Commit 1bfe3e1c authored by Jeff Trawick's avatar Jeff Trawick
Browse files

Use apr_parse_addr_port() in fix_hostname(). This simplifies the

code by a small (okay, tiny) amount and lets IPv6 numeric address
strings be passed through.
Obtained from:  the idea is from the KAME IPv6 patch for Apache 1.3


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87370 13f79535-47bb-0310-9956-ffa450edef68
parent 9d55830b
Loading
Loading
Loading
Loading
+31 −35
Original line number Diff line number Diff line
@@ -713,45 +713,41 @@ void ap_fini_vhost_config(apr_pool_t *p, server_rec *main_s)
 */
static void fix_hostname(request_rec *r)
{
    char *host = apr_palloc(r->pool, strlen(r->hostname) + 1);
    const char *src;
    char *host, *scope_id;
    char *dst;
    apr_port_t port;
    apr_status_t rv;

    rv = apr_parse_addr_port(&host, &scope_id, &port, r->hostname, r->pool);
    if (rv != APR_SUCCESS || scope_id) {
        goto bad;
    }

    /* check and copy the host part */
    src = r->hostname;
    /* if the hostname is an IPv6 numeric address string, it was validated 
     * already; otherwise, further validation is needed 
     */
    if (r->hostname[0] != '[') {
        dst = host;
    while (*src) {
	if (!apr_isalnum(*src) && *src != '-') {
	    if (*src == '.') {
		*dst++ = *src++;
		if (*src == '.')
        while (*dst) {
            if (!apr_isalnum(*dst) && *dst != '-') {
                if (*dst == '.') {
                    dst++;
                    if (*dst == '.')
                        goto bad;
                    else
                        continue;
                }
	    if (*src == ':')
		break;
	    else
		goto bad;
	} else {
	    *dst++ = *src++;
	}
    }
    /* check the port part */
    if (*src++ == ':') {
	while (*src) {
	    if (!apr_isdigit(*src++)) {
                goto bad;
            }
            else {
                dst++;
            }
        }
        /* strip trailing gubbins */
        if (dst > host && dst[-1] == '.') {
            dst[-1] = '\0';
    } else {
	dst[0] = '\0';
        }

    }
    r->hostname = host;
    return;