Commit ce33bf2b authored by Jeff Trawick's avatar Jeff Trawick
Browse files

back-port this from 2.1-dev:

  Fix handling of IPv6 numeric strings in mod_proxy.

Submitted by:	trawick
Reviewed by:	minfrin, nd


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/APACHE_2_0_BRANCH@103774 13f79535-47bb-0310-9956-ffa450edef68
parent ac7d6841
Loading
Loading
Loading
Loading
+2 −0
Changes for CHANGES: 2 added lines, 0 removed lines.
Original line number Diff line number Diff line
Changes with Apache 2.0.50
  *) Fix handling of IPv6 numeric strings in mod_proxy.  [Jeff Trawick]
  *) mod_isapi: send_response_header() failed to copy status string's 
     last character.  PR 20619.  [Jesse Pelton <jsp pkc.com>]
+1 −7
Changes for STATUS: 1 added line, 7 removed lines.
Original line number Diff line number Diff line
APACHE 2.0 STATUS:                                              -*-text-*-
Last modified at [$Date: 2004/05/26 11:50:42 $]
Last modified at [$Date: 2004/05/26 12:00:57 $]

Release:

@@ -83,12 +83,6 @@ PATCHES TO BACKPORT FROM 2.1
       PR 24922 [Pascal Terjan <pterjan@linuxfr.org>]
       +1: minfrin, nd

    *) Fix handling of IPv6 numeric strings in mod_proxy.
         modules/proxy/proxy_ftp.c r1.141, r1.142
         modules/proxy/proxy_http.c r1.186
         modules/proxy/proxy_util.c r1.107
       +1: trawick, minfrin, nd

    *) RPM spec file changes: changed default dependancy to link to db4
       instead of db3. Fixed complaints about unpackaged files.
       build/rpm/httpd.spec.in: r1.5
+3 −0
Changes for modules/proxy/proxy_ftp.c: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -205,6 +205,9 @@ int ap_proxy_ftp_canon(request_rec *r, char *url)
    else
        sport[0] = '\0';

    if (ap_strchr_c(host, ':')) { /* if literal IPv6 address */
        host = apr_pstrcat(p, "[", host, "]", NULL);
    }
    r->filename = apr_pstrcat(p, "proxy:ftp://", (user != NULL) ? user : "",
                              (password != NULL) ? ":" : "",
                              (password != NULL) ? password : "",
+8 −1
Changes for modules/proxy/proxy_http.c: 8 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -71,8 +71,12 @@ int ap_proxy_http_canon(request_rec *r, char *url)
     */
    port = def_port;
    err = ap_proxy_canon_netloc(r->pool, &url, NULL, NULL, &host, &port);
    if (err)
    if (err) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                      "error parsing URL %s: %s",
                      url, err);
        return HTTP_BAD_REQUEST;
    }

    /* now parse path/search args, according to rfc1738 */
    /* N.B. if this isn't a true proxy request, then the URL _path_
@@ -97,6 +101,9 @@ int ap_proxy_http_canon(request_rec *r, char *url)
    else
        sport[0] = '\0';

    if (ap_strchr_c(host, ':')) { /* if literal IPv6 address */
        host = apr_pstrcat(r->pool, "[", host, "]", NULL);
    }
    r->filename = apr_pstrcat(r->pool, "proxy:", scheme, "://", host, sport, 
            "/", path, (search) ? "?" : "", (search) ? search : "", NULL);
    return OK;
+14 −36
Changes for modules/proxy/proxy_util.c: 14 added lines, 36 removed lines.
Original line number Diff line number Diff line
@@ -197,9 +197,10 @@ PROXY_DECLARE(char *)
     ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
			char **passwordp, char **hostp, apr_port_t *port)
{
    int i;
    char *strp, *host, *url = *urlp;
    char *addr, *scope_id, *strp, *host, *url = *urlp;
    char *user = NULL, *password = NULL;
    apr_port_t tmp_port;
    apr_status_t rv;

    if (url[0] != '/' || url[1] != '/')
	return "Malformed URL";
@@ -238,44 +239,21 @@ PROXY_DECLARE(char *)
	*passwordp = password;
    }

    strp = strrchr(host, ':');
    if (strp != NULL) {
	*(strp++) = '\0';

	for (i = 0; strp[i] != '\0'; i++)
	    if (!apr_isdigit(strp[i]))
		break;

	/* if (i == 0) the no port was given; keep default */
	if (strp[i] != '\0') {
	    return "Bad port number in URL";
	} else if (i > 0) {
            int int_port = atoi(strp);

	    if (int_port > 65535)
		return "Port number in URL > 65535";

	    *port = (apr_port_t)int_port;
    /* Parse the host string to separate host portion from optional port.
     * Perform range checking on port.
     */
    rv = apr_parse_addr_port(&addr, &scope_id, &tmp_port, host, p);
    if (rv != APR_SUCCESS || addr == NULL || scope_id != NULL) {
        return "Invalid host/port";
    }
    }
    ap_str_tolower(host);		/* DNS names are case-insensitive */
    if (*host == '\0')
	return "Missing host in URL";
/* check hostname syntax */
    for (i = 0; host[i] != '\0'; i++)
	if (!apr_isdigit(host[i]) && host[i] != '.')
	    break;
    /* must be an IP address */
    if (host[i] == '\0' && (apr_inet_addr(host) == -1))
    {
	return "Bad IP address in URL";
    if (tmp_port != 0) { /* only update caller's port if port was specified */
        *port = tmp_port;
    }

/*    if (strchr(host,'.') == NULL && domain != NULL)
   host = pstrcat(p, host, domain, NULL);
 */
    ap_str_tolower(addr); /* DNS names are case-insensitive */

    *urlp = url;
    *hostp = host;
    *hostp = addr;

    return NULL;
}