Skip to content

Commit 90a26a4

Browse files
Avi Brenderkaplanlior
Avi Brender
authored andcommitted
Implement FR #55651 (Option to ignore the returned FTP PASV address)
1 parent 0716160 commit 90a26a4

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
@@ -722,10 +722,11 @@ ftp_pasv(ftpbuf_t *ftp, int pasv)
722722
memset(&ftp->pasvaddr, 0, n);
723723
sa = (struct sockaddr *) &ftp->pasvaddr;
724724

725-
#if HAVE_IPV6
726725
if (getpeername(ftp->fd, sa, &n) < 0) {
727726
return 0;
728727
}
728+
729+
#if HAVE_IPV6
729730
if (sa->sa_family == AF_INET6) {
730731
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
731732
char *endptr, delimiter;
@@ -778,8 +779,9 @@ ftp_pasv(ftpbuf_t *ftp, int pasv)
778779
ipbox.c[n] = (unsigned char) b[n];
779780
}
780781
sin = (struct sockaddr_in *) sa;
781-
sin->sin_family = AF_INET;
782-
sin->sin_addr = ipbox.ia[0];
782+
if (ftp->usepasvaddress) {
783+
sin->sin_addr = ipbox.ia[0];
784+
}
783785
sin->sin_port = ipbox.s[2];
784786

785787
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
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
@@ -315,6 +315,7 @@ PHP_MINIT_FUNCTION(ftp)
315315
REGISTER_LONG_CONSTANT("FTP_AUTORESUME", PHP_FTP_AUTORESUME, CONST_PERSISTENT | CONST_CS);
316316
REGISTER_LONG_CONSTANT("FTP_TIMEOUT_SEC", PHP_FTP_OPT_TIMEOUT_SEC, CONST_PERSISTENT | CONST_CS);
317317
REGISTER_LONG_CONSTANT("FTP_AUTOSEEK", PHP_FTP_OPT_AUTOSEEK, CONST_PERSISTENT | CONST_CS);
318+
REGISTER_LONG_CONSTANT("FTP_USEPASVADDRESS", PHP_FTP_OPT_USEPASVADDRESS, CONST_PERSISTENT | CONST_CS);
318319
REGISTER_LONG_CONSTANT("FTP_FAILED", PHP_FTP_FAILED, CONST_PERSISTENT | CONST_CS);
319320
REGISTER_LONG_CONSTANT("FTP_FINISHED", PHP_FTP_FINISHED, CONST_PERSISTENT | CONST_CS);
320321
REGISTER_LONG_CONSTANT("FTP_MOREDATA", PHP_FTP_MOREDATA, CONST_PERSISTENT | CONST_CS);
@@ -363,6 +364,7 @@ PHP_FUNCTION(ftp_connect)
363364

364365
/* autoseek for resuming */
365366
ftp->autoseek = FTP_DEFAULT_AUTOSEEK;
367+
ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS;
366368
#if HAVE_OPENSSL_EXT
367369
/* disable ssl */
368370
ftp->use_ssl = 0;
@@ -399,6 +401,7 @@ PHP_FUNCTION(ftp_ssl_connect)
399401

400402
/* autoseek for resuming */
401403
ftp->autoseek = FTP_DEFAULT_AUTOSEEK;
404+
ftp->usepasvaddress = FTP_DEFAULT_USEPASVADDRESS;
402405
/* enable ssl */
403406
ftp->use_ssl = 1;
404407

@@ -1399,6 +1402,15 @@ PHP_FUNCTION(ftp_set_option)
13991402
ftp->autoseek = Z_LVAL_P(z_value);
14001403
RETURN_TRUE;
14011404
break;
1405+
case PHP_FTP_OPT_USEPASVADDRESS:
1406+
if (Z_TYPE_P(z_value) != IS_BOOL) {
1407+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Option USEPASVADDRESS expects value of type boolean, %s given",
1408+
zend_zval_type_name(z_value));
1409+
RETURN_FALSE;
1410+
}
1411+
ftp->usepasvaddress = Z_LVAL_P(z_value);
1412+
RETURN_TRUE;
1413+
break;
14021414
default:
14031415
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown option '%ld'", option);
14041416
RETURN_FALSE;
@@ -1428,6 +1440,9 @@ PHP_FUNCTION(ftp_get_option)
14281440
case PHP_FTP_OPT_AUTOSEEK:
14291441
RETURN_BOOL(ftp->autoseek);
14301442
break;
1443+
case PHP_FTP_OPT_USEPASVADDRESS:
1444+
RETURN_BOOL(ftp->usepasvaddress);
1445+
break;
14311446
default:
14321447
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown option '%ld'", option);
14331448
RETURN_FALSE;

ext/ftp/php_ftp.h

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

3030
#define PHP_FTP_OPT_TIMEOUT_SEC 0
3131
#define PHP_FTP_OPT_AUTOSEEK 1
32+
#define PHP_FTP_OPT_USEPASVADDRESS 2
3233
#define PHP_FTP_AUTORESUME -1
3334

3435
PHP_MINIT_FUNCTION(ftp);

0 commit comments

Comments
 (0)