]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r832172 from trunk:
authorJim Jagielski <jim@apache.org>
Tue, 10 Aug 2010 19:11:40 +0000 (19:11 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 10 Aug 2010 19:11:40 +0000 (19:11 +0000)
Vhosts: treating a pure-numeric Host header as a port is nonsense.
PR 44979

Submitted by: niq
Reviewed/backported by: jim

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@984172 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
server/vhost.c

diff --git a/CHANGES b/CHANGES
index c2062a20474eb3278a81d47f01bea5e45f649e62..246090343dd8da4ca6ee3b166b475d640c225dd3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.2.17
 
+  *) vhost: A purely-numeric Host: header should not be treated as a port.
+     PR 44979 [Nick Kew]
+
   *) core: (re)-introduce -T commandline option to suppress documentroot
      check at startup.
      PR 41887 [Jan van den Berg <janvdberg gmail.com>]
diff --git a/STATUS b/STATUS
index bc22ad049ddb260e19e17f8223575ce2ba021d11..47db0ab098d317c1846b64d6dd85d7571d41cc2b 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -87,11 +87,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
 
-   * VHosts: fix parsing of pure-numeric hostname.
-     PR 44979
-     Trunk patch: http://svn.apache.org/viewvc?view=revision&revision=832172
-     2.2 patch: trunk patch Works with offset.
-     +1: niq, rpluem, jim
 
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
index 5b79fea598bcb026b1b9f116f0b3cba0d18e1af3..b8e9ca7594ca3af6cd8d07b7a47f2ae39d2da317 100644 (file)
@@ -706,25 +706,27 @@ static void fix_hostname(request_rec *r)
     char *dst;
     apr_port_t port;
     apr_status_t rv;
+    const char *c;
 
     /* According to RFC 2616, Host header field CAN be blank. */
     if (!*r->hostname) {
         return;
     }
 
+    /* apr_parse_addr_port will interpret a bare integer as a port
+     * which is incorrect in this context.  So treat it separately.
+     */
+    for (c = r->hostname; apr_isdigit(*c); ++c);
+    if (!*c) {  /* pure integer */
+        return;
+    }
+
     rv = apr_parse_addr_port(&host, &scope_id, &port, r->hostname, r->pool);
     if (rv != APR_SUCCESS || scope_id) {
         goto bad;
     }
 
-    if (!host && port) {
-        /* silly looking host ("Host: 123") but that isn't our job
-         * here to judge; apr_parse_addr_port() would think we had a port
-         * but no address
-         */
-        host = apr_itoa(r->pool, (int)port);
-    }
-    else if (port) {
+    if (port) {
         /* Don't throw the Host: header's port number away:
            save it in parsed_uri -- ap_get_server_port() needs it! */
         /* @@@ XXX there should be a better way to pass the port.