summaryrefslogtreecommitdiff
path: root/server/vhost.c
diff options
context:
space:
mode:
authorJeff Trawick <trawick@apache.org>2000-12-16 12:54:53 +0000
committerJeff Trawick <trawick@apache.org>2000-12-16 12:54:53 +0000
commit6b3c397afb463e200b7342fa0b59ad8d628e3185 (patch)
treeb3b4cf8ab03a816f99355fa646bed94a36ca8a61 /server/vhost.c
parentcecc389912d5ac8589829589f8361c51b71278eb (diff)
downloadhttpd-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.c66
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;