From 6b3c397afb463e200b7342fa0b59ad8d628e3185 Mon Sep 17 00:00:00 2001 From: Jeff Trawick Date: Sat, 16 Dec 2000 12:54:53 +0000 Subject: [PATCH] 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 --- server/vhost.c | 66 ++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 35 deletions(-) diff --git a/server/vhost.c b/server/vhost.c index 914a7367a4..947bb9a671 100644 --- a/server/vhost.c +++ b/server/vhost.c @@ -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; - /* check and copy the host part */ - src = r->hostname; - dst = host; - while (*src) { - if (!apr_isalnum(*src) && *src != '-') { - if (*src == '.') { - *dst++ = *src++; - if (*src == '.') - 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; - } - } - } - /* strip trailing gubbins */ - if (dst > host && dst[-1] == '.') { - dst[-1] = '\0'; - } else { - dst[0] = '\0'; + rv = apr_parse_addr_port(&host, &scope_id, &port, r->hostname, r->pool); + if (rv != APR_SUCCESS || scope_id) { + goto bad; } + /* 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 (*dst) { + if (!apr_isalnum(*dst) && *dst != '-') { + if (*dst == '.') { + dst++; + if (*dst == '.') + goto bad; + else + continue; + } + goto bad; + } + else { + dst++; + } + } + /* strip trailing gubbins */ + if (dst > host && dst[-1] == '.') { + dst[-1] = '\0'; + } + } r->hostname = host; return; -- 2.50.1