From: Jim Jagielski Date: Thu, 1 Nov 2012 15:02:46 +0000 (+0000) Subject: *) mod_proxy_ftp: Fix segfaults on IPv4 requests to hosts with DNS AAAA records. X-Git-Tag: 2.5.0-alpha~6168 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e312c72dad4c0ec4769db9d975ee2497c5aedea;p=thirdparty%2Fapache%2Fhttpd.git *) mod_proxy_ftp: Fix segfaults on IPv4 requests to hosts with DNS AAAA records. PR 40841. [Andrew Rucker Jones , , Jim Jagielski] git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1404625 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 27b9350effe..1b7a430c3c7 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.0 + *) mod_proxy_ftp: Fix segfaults on IPv4 requests to hosts with DNS AAAA records. + PR 40841. [Andrew Rucker Jones , + , Jim Jagielski] + *) ap_expr: Add req_novary function that allows HTTP header lookups without adding the name to the Vary header. [Stefan Fritsch] diff --git a/modules/proxy/mod_proxy_ftp.c b/modules/proxy/mod_proxy_ftp.c index 825e2094f0d..4b7fef2fb42 100644 --- a/modules/proxy/mod_proxy_ftp.c +++ b/modules/proxy/mod_proxy_ftp.c @@ -1411,7 +1411,7 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r, "EPSV contacting remote host on port %d", data_port); - if ((rv = apr_socket_create(&data_sock, connect_addr->family, SOCK_STREAM, 0, r->pool)) != APR_SUCCESS) { + if ((rv = apr_socket_create(&data_sock, origin->client_addr->family, SOCK_STREAM, 0, r->pool)) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01040) "error creating EPSV socket"); proxy_ftp_cleanup(r, backend); @@ -1436,8 +1436,13 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, /* make the connection */ apr_socket_addr_get(&data_addr, APR_REMOTE, sock); apr_sockaddr_ip_get(&data_ip, data_addr); - apr_sockaddr_info_get(&epsv_addr, data_ip, connect_addr->family, data_port, 0, p); - rv = apr_socket_connect(data_sock, epsv_addr); + apr_sockaddr_info_get(&epsv_addr, data_ip, origin->client_addr->family, data_port, 0, p); + if (!data_sock) + rv = APR_ENOSOCKET; + else if (!epsv_addr) + rv = APR_EBADIP; + else + rv = apr_socket_connect(data_sock, epsv_addr); if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01043) "EPSV attempt to connect to %pI failed - "