]> granicus.if.org Git - apache/commitdiff
Use apr_parse_addr_port() in fix_hostname(). This simplifies the
authorJeff Trawick <trawick@apache.org>
Sat, 16 Dec 2000 12:54:53 +0000 (12:54 +0000)
committerJeff Trawick <trawick@apache.org>
Sat, 16 Dec 2000 12:54:53 +0000 (12:54 +0000)
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

index 914a7367a4bc87e3a64b8c4f8fe5b190e96c1a0a..947bb9a6714f0064c476da5c11811831c4f317fd 100644 (file)
@@ -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;