Skip to content

Commit 10a5749

Browse files
committed
Merge branch 'PHP-7.0'
* PHP-7.0: Implement FR #55651 (Option to ignore the returned FTP PASV address)
2 parents 29a2c64 + 94f3887 commit 10a5749

File tree

4 files changed

+23
-3
lines changed

4 files changed

+23
-3
lines changed

ext/ftp/ftp.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -754,10 +754,11 @@ ftp_pasv(ftpbuf_t *ftp, int pasv)
754754
memset(&ftp->pasvaddr, 0, n);
755755
sa = (struct sockaddr *) &ftp->pasvaddr;
756756

757-
#if HAVE_IPV6
758757
if (getpeername(ftp->fd, sa, &n) < 0) {
759758
return 0;
760759
}
760+
761+
#if HAVE_IPV6
761762
if (sa->sa_family == AF_INET6) {
762763
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
763764
char *endptr, delimiter;
@@ -810,8 +811,9 @@ ftp_pasv(ftpbuf_t *ftp, int pasv)
810811
ipbox.c[n] = (unsigned char) b[n];
811812
}
812813
sin = (struct sockaddr_in *) sa;
813-
sin->sin_family = AF_INET;
814-
sin->sin_addr = ipbox.ia[0];
814+
if (ftp->usepasvaddress) {
815+
sin->sin_addr = ipbox.ia[0];
816+
}
815817
sin->sin_port = ipbox.s[2];
816818

817819
ftp->pasv = 2;

ext/ftp/ftp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
#define FTP_DEFAULT_TIMEOUT 90
3333
#define FTP_DEFAULT_AUTOSEEK 1
34+
#define FTP_DEFAULT_USEPASVADDRESS 1
3435
#define PHP_FTP_FAILED 0
3536
#define PHP_FTP_FINISHED 1
3637
#define PHP_FTP_MOREDATA 2
@@ -71,6 +72,7 @@ typedef struct ftpbuf
7172
php_sockaddr_storage pasvaddr; /* passive mode address */
7273
zend_long timeout_sec; /* User configurable timeout (seconds) */
7374
int autoseek; /* User configurable autoseek flag */
75+
int usepasvaddress; /* Use the address returned by the pasv command */
7476

7577
int nb; /* "nonblocking" transfer in progress */
7678
databuf_t *data; /* Data connection for "nonblocking" transfers */

ext/ftp/php_ftp.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ PHP_MINIT_FUNCTION(ftp)
326326
REGISTER_LONG_CONSTANT("FTP_AUTORESUME", PHP_FTP_AUTORESUME, CONST_PERSISTENT | CONST_CS);
327327
REGISTER_LONG_CONSTANT("FTP_TIMEOUT_SEC", PHP_FTP_OPT_TIMEOUT_SEC, CONST_PERSISTENT | CONST_CS);
328328
REGISTER_LONG_CONSTANT("FTP_AUTOSEEK", PHP_FTP_OPT_AUTOSEEK, CONST_PERSISTENT | CONST_CS);
329+
REGISTER_LONG_CONSTANT("FTP_USEPASVADDRESS", PHP_FTP_OPT_USEPASVADDRESS, CONST_PERSISTENT | CONST_CS);
329330
REGISTER_LONG_CONSTANT("FTP_FAILED", PHP_FTP_FAILED, CONST_PERSISTENT | CONST_CS);
330331
REGISTER_LONG_CONSTANT("FTP_FINISHED", PHP_FTP_FINISHED, CONST_PERSISTENT | CONST_CS);
331332
REGISTER_LONG_CONSTANT("FTP_MOREDATA", PHP_FTP_MOREDATA, CONST_PERSISTENT | CONST_CS);
@@ -379,6 +380,7 @@ PHP_FUNCTION(ftp_connect)
379380

380381
/* autoseek for resuming */
381382
ftp->autoseek = FTP_DEFAULT_AUTOSEEK;
383+
ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS;
382384
#ifdef HAVE_FTP_SSL
383385
/* disable ssl */
384386
ftp->use_ssl = 0;
@@ -415,6 +417,7 @@ PHP_FUNCTION(ftp_ssl_connect)
415417

416418
/* autoseek for resuming */
417419
ftp->autoseek = FTP_DEFAULT_AUTOSEEK;
420+
ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS;
418421
/* enable ssl */
419422
ftp->use_ssl = 1;
420423

@@ -1478,6 +1481,15 @@ PHP_FUNCTION(ftp_set_option)
14781481
ftp->autoseek = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
14791482
RETURN_TRUE;
14801483
break;
1484+
case PHP_FTP_OPT_USEPASVADDRESS:
1485+
if (Z_TYPE_P(z_value) != IS_TRUE && Z_TYPE_P(z_value) != IS_FALSE) {
1486+
php_error_docref(NULL, E_WARNING, "Option USEPASVADDRESS expects value of type boolean, %s given",
1487+
zend_zval_type_name(z_value));
1488+
RETURN_FALSE;
1489+
}
1490+
ftp->usepasvaddress = Z_TYPE_P(z_value) == IS_TRUE ? 1 : 0;
1491+
RETURN_TRUE;
1492+
break;
14811493
default:
14821494
php_error_docref(NULL, E_WARNING, "Unknown option '%pd'", option);
14831495
RETURN_FALSE;
@@ -1509,6 +1521,9 @@ PHP_FUNCTION(ftp_get_option)
15091521
case PHP_FTP_OPT_AUTOSEEK:
15101522
RETURN_BOOL(ftp->autoseek);
15111523
break;
1524+
case PHP_FTP_OPT_USEPASVADDRESS:
1525+
RETURN_BOOL(ftp->usepasvaddress);
1526+
break;
15121527
default:
15131528
php_error_docref(NULL, E_WARNING, "Unknown option '%pd'", option);
15141529
RETURN_FALSE;

ext/ftp/php_ftp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ extern zend_module_entry php_ftp_module_entry;
3232

3333
#define PHP_FTP_OPT_TIMEOUT_SEC 0
3434
#define PHP_FTP_OPT_AUTOSEEK 1
35+
#define PHP_FTP_OPT_USEPASVADDRESS 2
3536
#define PHP_FTP_AUTORESUME -1
3637

3738
PHP_MINIT_FUNCTION(ftp);

0 commit comments

Comments
 (0)