]> granicus.if.org Git - apache/commitdiff
*) mod_proxy_ftp: Fix segfaults on IPv4 requests to hosts with DNS AAAA records.
authorJim Jagielski <jim@apache.org>
Thu, 1 Nov 2012 15:02:46 +0000 (15:02 +0000)
committerJim Jagielski <jim@apache.org>
Thu, 1 Nov 2012 15:02:46 +0000 (15:02 +0000)
     PR  40841. [Andrew Rucker Jones <arjones simultan dyndns org>,
     <ast domdv de>, Jim Jagielski]

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1404625 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/proxy/mod_proxy_ftp.c

diff --git a/CHANGES b/CHANGES
index 27b9350effe815fc6299dfe5f8e59a1542274545..1b7a430c3c730282877df9b31b280bf36219e9f7 100644 (file)
--- 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 <arjones simultan dyndns org>,
+     <ast domdv de>, Jim Jagielski]
+
   *) ap_expr: Add req_novary function that allows HTTP header lookups
      without adding the name to the Vary header. [Stefan Fritsch]
 
index 825e2094f0d52009c6df02fdb648b7757042a4ec..4b7fef2fb42f26385ccc6684fbb2035ed5985269 100644 (file)
@@ -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 - "