diff options
author | Jeff Trawick <trawick@apache.org> | 2000-12-16 12:54:53 +0000 |
---|---|---|
committer | Jeff Trawick <trawick@apache.org> | 2000-12-16 12:54:53 +0000 |
commit | 6b3c397afb463e200b7342fa0b59ad8d628e3185 (patch) | |
tree | b3b4cf8ab03a816f99355fa646bed94a36ca8a61 /server/vhost.c | |
parent | cecc389912d5ac8589829589f8361c51b71278eb (diff) | |
download | httpd-6b3c397afb463e200b7342fa0b59ad8d628e3185.tar.gz |
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
Diffstat (limited to 'server/vhost.c')
-rw-r--r-- | server/vhost.c | 66 |
1 files 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; |