Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:55354 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 13385 invoked from network); 10 Sep 2011 17:01:02 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 10 Sep 2011 17:01:02 -0000 Received: from [127.0.0.1] ([127.0.0.1:21404]) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ECSTREAM id 3E/55-53180-EC79B6E4 for ; Sat, 10 Sep 2011 13:01:02 -0400 Authentication-Results: pb1.pair.com header.from=abrender@elitehosts.com; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=abrender@elitehosts.com; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain elitehosts.com from 209.67.29.110 cause and error) X-PHP-List-Original-Sender: abrender@elitehosts.com X-Host-Fingerprint: 209.67.29.110 webmail.elitehosts.com Received: from [209.67.29.110] ([209.67.29.110:44595] helo=ezri.elitehosts.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 33/55-53180-9649B6E4 for ; Sat, 10 Sep 2011 12:46:33 -0400 Received: from al.secure.elitehosts.com ([209.67.23.117] helo=[192.168.40.6]) by ezri.elitehosts.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1R2QhJ-0007pp-8p for internals@lists.php.net; Sat, 10 Sep 2011 12:46:29 -0400 Message-ID: <4E6B9466.6060608@elitehosts.com> Date: Sat, 10 Sep 2011 12:46:30 -0400 Organization: Elite Hosts User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.21) Gecko/20110831 Thunderbird/3.1.13 MIME-Version: 1.0 To: internals@lists.php.net Content-Type: multipart/mixed; boundary="------------010104070502000500030609" Subject: [PATCH]#55651 From: abrender@elitehosts.com (Avi Brender) --------------010104070502000500030609 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I've submitted bug #55651 along with a patch to implement a fix (also attached) for the passive FTP mode issue. I was hoping that someone could review the bug report and consider the patch for inclusion in future PHP releases. Thanks so much! Avi Brender Elite Hosts, Inc www.elitehosts.com --------------010104070502000500030609 Content-Type: text/plain; name="ftp_usepasvaddress.patch.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="ftp_usepasvaddress.patch.txt" diff -NaurbB ext/ftp.orig/ftp.c ext/ftp/ftp.c --- ext/ftp.orig/ftp.c 2010-12-31 21:19:59.000000000 -0500 +++ ext/ftp/ftp.c 2011-09-09 03:51:08.000000000 -0400 @@ -712,10 +712,11 @@ memset(&ftp->pasvaddr, 0, n); sa = (struct sockaddr *) &ftp->pasvaddr; -#if HAVE_IPV6 if (getpeername(ftp->fd, sa, &n) < 0) { return 0; } + +#if HAVE_IPV6 if (sa->sa_family == AF_INET6) { struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; char *endptr, delimiter; @@ -768,8 +769,9 @@ ipbox.c[n] = (unsigned char) b[n]; } sin = (struct sockaddr_in *) sa; - sin->sin_family = AF_INET; + if (ftp->usepasvaddress) { sin->sin_addr = ipbox.ia[0]; + } sin->sin_port = ipbox.s[2]; ftp->pasv = 2; diff -NaurbB ext/ftp.orig/ftp.h ext/ftp/ftp.h --- ext/ftp.orig/ftp.h 2010-12-31 21:19:59.000000000 -0500 +++ ext/ftp/ftp.h 2011-09-09 03:52:38.000000000 -0400 @@ -31,6 +31,7 @@ #define FTP_DEFAULT_TIMEOUT 90 #define FTP_DEFAULT_AUTOSEEK 1 +#define FTP_DEFAULT_USEPASVADDRESS 1 #define PHP_FTP_FAILED 0 #define PHP_FTP_FINISHED 1 #define PHP_FTP_MOREDATA 2 @@ -71,6 +72,7 @@ php_sockaddr_storage pasvaddr; /* passive mode address */ long timeout_sec; /* User configureable timeout (seconds) */ int autoseek; /* User configureable autoseek flag */ + int usepasvaddress; /* Use the address returned by the pasv command */ int nb; /* "nonblocking" transfer in progress */ databuf_t *data; /* Data connection for "nonblocking" transfers */ diff -NaurbB ext/ftp.orig/php_ftp.c ext/ftp/php_ftp.c --- ext/ftp.orig/php_ftp.c 2010-12-31 21:19:59.000000000 -0500 +++ ext/ftp/php_ftp.c 2011-09-09 03:55:02.000000000 -0400 @@ -315,6 +315,7 @@ REGISTER_LONG_CONSTANT("FTP_AUTORESUME", PHP_FTP_AUTORESUME, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("FTP_TIMEOUT_SEC", PHP_FTP_OPT_TIMEOUT_SEC, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("FTP_AUTOSEEK", PHP_FTP_OPT_AUTOSEEK, CONST_PERSISTENT | CONST_CS); + REGISTER_LONG_CONSTANT("FTP_USEPASVADDRESS", PHP_FTP_OPT_USEPASVADDRESS, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("FTP_FAILED", PHP_FTP_FAILED, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("FTP_FINISHED", PHP_FTP_FINISHED, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("FTP_MOREDATA", PHP_FTP_MOREDATA, CONST_PERSISTENT | CONST_CS); @@ -363,6 +364,7 @@ /* autoseek for resuming */ ftp->autoseek = FTP_DEFAULT_AUTOSEEK; + ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS; #if HAVE_OPENSSL_EXT /* disable ssl */ ftp->use_ssl = 0; @@ -399,6 +401,7 @@ /* autoseek for resuming */ ftp->autoseek = FTP_DEFAULT_AUTOSEEK; + ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS; /* enable ssl */ ftp->use_ssl = 1; @@ -1395,6 +1398,15 @@ ftp->autoseek = Z_LVAL_P(z_value); RETURN_TRUE; break; + case PHP_FTP_OPT_USEPASVADDRESS: + if (Z_TYPE_P(z_value) != IS_BOOL) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Option USEPASVADDRESS expects value of type boolean, %s given", + zend_zval_type_name(z_value)); + RETURN_FALSE; + } + ftp->usepasvaddress = Z_LVAL_P(z_value); + RETURN_TRUE; + break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown option '%ld'", option); RETURN_FALSE; @@ -1424,6 +1436,9 @@ case PHP_FTP_OPT_AUTOSEEK: RETURN_BOOL(ftp->autoseek); break; + case PHP_FTP_OPT_USEPASVADDRESS: + RETURN_BOOL(ftp->usepasvaddress); + break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown option '%ld'", option); RETURN_FALSE; diff -NaurbB ext/ftp.orig/php_ftp.h ext/ftp/php_ftp.h --- ext/ftp.orig/php_ftp.h 2010-12-31 21:19:59.000000000 -0500 +++ ext/ftp/php_ftp.h 2011-09-09 02:59:44.000000000 -0400 @@ -29,6 +29,7 @@ #define PHP_FTP_OPT_TIMEOUT_SEC 0 #define PHP_FTP_OPT_AUTOSEEK 1 +#define PHP_FTP_OPT_USEPASVADDRESS 2 #define PHP_FTP_AUTORESUME -1 PHP_MINIT_FUNCTION(ftp); --------------010104070502000500030609--