httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From traw...@apache.org
Subject cvs commit: httpd-2.0/modules/proxy proxy_ftp.c proxy_http.c proxy_util.c
Date Wed, 19 May 2004 13:30:15 GMT
trawick     2004/05/19 06:30:15

  Modified:    .        CHANGES
               modules/proxy proxy_ftp.c proxy_http.c proxy_util.c
  Log:
  Fix handling of IPv6 numeric strings in mod_proxy.
  
  (Some such operations would work if port was specified
  in url due to way parsing was performed, finding last ':'
  and considering everything after as the port.)
  
  Revision  Changes    Path
  1.1480    +2 -0      httpd-2.0/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/CHANGES,v
  retrieving revision 1.1479
  retrieving revision 1.1480
  diff -u -r1.1479 -r1.1480
  --- CHANGES	17 May 2004 23:36:15 -0000	1.1479
  +++ CHANGES	19 May 2004 13:30:13 -0000	1.1480
  @@ -2,6 +2,8 @@
   
     [Remove entries to the current 2.0 section below, when backported]
   
  +  *) Fix handling of IPv6 numeric strings in mod_proxy.  [Jeff Trawick]
  +
     *) External rewrite map responses are no longer limited to 2048
        bytes.  [André Malo]
   
  
  
  
  1.141     +3 -0      httpd-2.0/modules/proxy/proxy_ftp.c
  
  Index: proxy_ftp.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_ftp.c,v
  retrieving revision 1.140
  retrieving revision 1.141
  diff -u -r1.140 -r1.141
  --- proxy_ftp.c	10 Apr 2004 13:57:39 -0000	1.140
  +++ proxy_ftp.c	19 May 2004 13:30:14 -0000	1.141
  @@ -205,6 +205,9 @@
       else
           sport[0] = '\0';
   
  +    if (ap_strchr_c(host, ':')) { /* if literal IPv6 address */
  +        host = apr_pstrcat(p, "[", host, "]");
  +    }
       r->filename = apr_pstrcat(p, "proxy:ftp://", (user != NULL) ? user : "",
                                 (password != NULL) ? ":" : "",
                                 (password != NULL) ? password : "",
  
  
  
  1.186     +8 -1      httpd-2.0/modules/proxy/proxy_http.c
  
  Index: proxy_http.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_http.c,v
  retrieving revision 1.185
  retrieving revision 1.186
  diff -u -r1.185 -r1.186
  --- proxy_http.c	10 May 2004 13:58:56 -0000	1.185
  +++ proxy_http.c	19 May 2004 13:30:14 -0000	1.186
  @@ -71,8 +71,12 @@
        */
       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 @@
       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;
  
  
  
  1.107     +14 -36    httpd-2.0/modules/proxy/proxy_util.c
  
  Index: proxy_util.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_util.c,v
  retrieving revision 1.106
  retrieving revision 1.107
  diff -u -r1.106 -r1.107
  --- proxy_util.c	9 Feb 2004 20:29:21 -0000	1.106
  +++ proxy_util.c	19 May 2004 13:30:14 -0000	1.107
  @@ -197,9 +197,10 @@
        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 @@
   	*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;
   }
  
  
  

Mime
View raw message