Skip to content

Commit c2a06f5

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix #79100: Wrong FTP error messages
2 parents 30d3062 + 42c72ef commit c2a06f5

File tree

5 files changed

+112
-42
lines changed

5 files changed

+112
-42
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ PHP NEWS
1111

1212
- FTP:
1313
. Fixed bug #80901 (Info leak in ftp extension). (cmb)
14+
. Fixed bug #79100 (Wrong FTP error messages). (cmb)
1415

1516
- ODBC:
1617
. Fixed bug #80460 (ODBC doesn't account for SQL_NO_TOTAL indicator). (cmb)

ext/ftp/ftp.c

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@
5959
#include "ftp.h"
6060
#include "ext/standard/fsock.h"
6161

62+
#ifdef PHP_WIN32
63+
# undef ETIMEDOUT
64+
# define ETIMEDOUT WSAETIMEDOUT
65+
#endif
66+
6267
/* sends an ftp command, returns true on success, false on error.
6368
* it sends the string "cmd args\r\n" if args is non-null, or
6469
* "cmd\r\n" if args is null
@@ -1260,7 +1265,8 @@ ftp_putcmd(ftpbuf_t *ftp, const char *cmd, const size_t cmd_len, const char *arg
12601265

12611266
data = ftp->outbuf;
12621267

1263-
/* Clear the extra-lines buffer */
1268+
/* Clear the inbuf and extra-lines buffer */
1269+
ftp->inbuf[0] = '\0';
12641270
ftp->extra = NULL;
12651271

12661272
if (my_send(ftp, ftp->fd, data, size) != size) {
@@ -1430,15 +1436,15 @@ my_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
14301436
n = php_pollfd_for_ms(s, POLLOUT, ftp->timeout_sec * 1000);
14311437

14321438
if (n < 1) {
1433-
#ifdef PHP_WIN32
1439+
char buf[256];
14341440
if (n == 0) {
1441+
#ifdef PHP_WIN32
14351442
_set_errno(ETIMEDOUT);
1436-
}
14371443
#else
1438-
if (n == 0) {
14391444
errno = ETIMEDOUT;
1440-
}
14411445
#endif
1446+
}
1447+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, buf, sizeof buf));
14421448
return -1;
14431449
}
14441450

@@ -1466,18 +1472,17 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len)
14661472
SSL *handle = NULL;
14671473
php_socket_t fd;
14681474
#endif
1469-
14701475
n = php_pollfd_for_ms(s, PHP_POLLREADABLE, ftp->timeout_sec * 1000);
14711476
if (n < 1) {
1472-
#ifdef PHP_WIN32
1477+
char buf[256];
14731478
if (n == 0) {
1479+
#ifdef PHP_WIN32
14741480
_set_errno(ETIMEDOUT);
1475-
}
14761481
#else
1477-
if (n == 0) {
14781482
errno = ETIMEDOUT;
1479-
}
14801483
#endif
1484+
}
1485+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, buf, sizeof buf));
14811486
return -1;
14821487
}
14831488

@@ -1543,15 +1548,15 @@ data_available(ftpbuf_t *ftp, php_socket_t s)
15431548

15441549
n = php_pollfd_for_ms(s, PHP_POLLREADABLE, 1000);
15451550
if (n < 1) {
1546-
#ifdef PHP_WIN32
1551+
char buf[256];
15471552
if (n == 0) {
1553+
#ifdef PHP_WIN32
15481554
_set_errno(ETIMEDOUT);
1549-
}
15501555
#else
1551-
if (n == 0) {
15521556
errno = ETIMEDOUT;
1553-
}
15541557
#endif
1558+
}
1559+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, buf, sizeof buf));
15551560
return 0;
15561561
}
15571562

@@ -1566,15 +1571,15 @@ data_writeable(ftpbuf_t *ftp, php_socket_t s)
15661571

15671572
n = php_pollfd_for_ms(s, POLLOUT, 1000);
15681573
if (n < 1) {
1569-
#ifdef PHP_WIN32
1574+
char buf[256];
15701575
if (n == 0) {
1576+
#ifdef PHP_WIN32
15711577
_set_errno(ETIMEDOUT);
1572-
}
15731578
#else
1574-
if (n == 0) {
15751579
errno = ETIMEDOUT;
1576-
}
15771580
#endif
1581+
}
1582+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, buf, sizeof buf));
15781583
return 0;
15791584
}
15801585

@@ -1590,15 +1595,15 @@ my_accept(ftpbuf_t *ftp, php_socket_t s, struct sockaddr *addr, socklen_t *addrl
15901595

15911596
n = php_pollfd_for_ms(s, PHP_POLLREADABLE, ftp->timeout_sec * 1000);
15921597
if (n < 1) {
1593-
#ifdef PHP_WIN32
1598+
char buf[256];
15941599
if (n == 0) {
1600+
#ifdef PHP_WIN32
15951601
_set_errno(ETIMEDOUT);
1596-
}
15971602
#else
1598-
if (n == 0) {
15991603
errno = ETIMEDOUT;
1600-
}
16011604
#endif
1605+
}
1606+
php_error_docref(NULL, E_WARNING, "%s", php_socket_strerror(errno, buf, sizeof buf));
16021607
return -1;
16031608
}
16041609

ext/ftp/php_ftp.c

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ PHP_FUNCTION(ftp_login)
200200

201201
/* log in */
202202
if (!ftp_login(ftp, user, user_len, pass, pass_len)) {
203-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
203+
if (*ftp->inbuf) {
204+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
205+
}
204206
RETURN_FALSE;
205207
}
206208

@@ -224,7 +226,9 @@ PHP_FUNCTION(ftp_pwd)
224226
}
225227

226228
if (!(pwd = ftp_pwd(ftp))) {
227-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
229+
if (*ftp->inbuf) {
230+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
231+
}
228232
RETURN_FALSE;
229233
}
230234

@@ -247,7 +251,9 @@ PHP_FUNCTION(ftp_cdup)
247251
}
248252

249253
if (!ftp_cdup(ftp)) {
250-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
254+
if (*ftp->inbuf) {
255+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
256+
}
251257
RETURN_FALSE;
252258
}
253259

@@ -273,7 +279,9 @@ PHP_FUNCTION(ftp_chdir)
273279

274280
/* change directories */
275281
if (!ftp_chdir(ftp, dir, dir_len)) {
276-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
282+
if (*ftp->inbuf) {
283+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
284+
}
277285
RETURN_FALSE;
278286
}
279287

@@ -299,7 +307,9 @@ PHP_FUNCTION(ftp_exec)
299307

300308
/* execute serverside command */
301309
if (!ftp_exec(ftp, cmd, cmd_len)) {
302-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
310+
if (*ftp->inbuf) {
311+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
312+
}
303313
RETURN_FALSE;
304314
}
305315

@@ -347,7 +357,9 @@ PHP_FUNCTION(ftp_mkdir)
347357

348358
/* create directory */
349359
if (NULL == (tmp = ftp_mkdir(ftp, dir, dir_len))) {
350-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
360+
if (*ftp->inbuf) {
361+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
362+
}
351363
RETURN_FALSE;
352364
}
353365

@@ -373,7 +385,9 @@ PHP_FUNCTION(ftp_rmdir)
373385

374386
/* remove directorie */
375387
if (!ftp_rmdir(ftp, dir, dir_len)) {
376-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
388+
if (*ftp->inbuf) {
389+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
390+
}
377391
RETURN_FALSE;
378392
}
379393

@@ -399,7 +413,9 @@ PHP_FUNCTION(ftp_chmod)
399413
}
400414

401415
if (!ftp_chmod(ftp, mode, filename, filename_len)) {
402-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
416+
if (*ftp->inbuf) {
417+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
418+
}
403419
RETURN_FALSE;
404420
}
405421

@@ -548,7 +564,9 @@ PHP_FUNCTION(ftp_systype)
548564
}
549565

550566
if (NULL == (syst = ftp_syst(ftp))) {
551-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
567+
if (*ftp->inbuf) {
568+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
569+
}
552570
RETURN_FALSE;
553571
}
554572

@@ -593,7 +611,9 @@ PHP_FUNCTION(ftp_fget)
593611
}
594612

595613
if (!ftp_get(ftp, stream, file, file_len, xtype, resumepos)) {
596-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
614+
if (*ftp->inbuf) {
615+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
616+
}
597617
RETURN_FALSE;
598618
}
599619

@@ -642,7 +662,9 @@ PHP_FUNCTION(ftp_nb_fget)
642662
ftp->closestream = 0; /* do not close */
643663

644664
if ((ret = ftp_nb_get(ftp, stream, file, file_len, xtype, resumepos)) == PHP_FTP_FAILED) {
645-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
665+
if (*ftp->inbuf) {
666+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
667+
}
646668
RETURN_LONG(ret);
647669
}
648670

@@ -728,7 +750,9 @@ PHP_FUNCTION(ftp_get)
728750
if (!ftp_get(ftp, outstream, remote, remote_len, xtype, resumepos)) {
729751
php_stream_close(outstream);
730752
VCWD_UNLINK(local);
731-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
753+
if (*ftp->inbuf) {
754+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
755+
}
732756
RETURN_FALSE;
733757
}
734758

@@ -796,7 +820,9 @@ PHP_FUNCTION(ftp_nb_get)
796820
php_stream_close(outstream);
797821
ftp->stream = NULL;
798822
VCWD_UNLINK(local);
799-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
823+
if (*ftp->inbuf) {
824+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
825+
}
800826
RETURN_LONG(PHP_FTP_FAILED);
801827
}
802828

@@ -888,7 +914,9 @@ PHP_FUNCTION(ftp_fput)
888914
}
889915

890916
if (!ftp_put(ftp, remote, remote_len, stream, xtype, startpos)) {
891-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
917+
if (*ftp->inbuf) {
918+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
919+
}
892920
RETURN_FALSE;
893921
}
894922

@@ -941,7 +969,9 @@ PHP_FUNCTION(ftp_nb_fput)
941969
ftp->closestream = 0; /* do not close */
942970

943971
if (((ret = ftp_nb_put(ftp, remote, remote_len, stream, xtype, startpos)) == PHP_FTP_FAILED)) {
944-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
972+
if (*ftp->inbuf) {
973+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
974+
}
945975
RETURN_LONG(ret);
946976
}
947977

@@ -994,7 +1024,9 @@ PHP_FUNCTION(ftp_put)
9941024

9951025
if (!ftp_put(ftp, remote, remote_len, instream, xtype, startpos)) {
9961026
php_stream_close(instream);
997-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1027+
if (*ftp->inbuf) {
1028+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1029+
}
9981030
RETURN_FALSE;
9991031
}
10001032
php_stream_close(instream);
@@ -1029,7 +1061,9 @@ PHP_FUNCTION(ftp_append)
10291061

10301062
if (!ftp_append(ftp, remote, remote_len, instream, xtype)) {
10311063
php_stream_close(instream);
1032-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1064+
if (*ftp->inbuf) {
1065+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1066+
}
10331067
RETURN_FALSE;
10341068
}
10351069
php_stream_close(instream);
@@ -1159,7 +1193,9 @@ PHP_FUNCTION(ftp_rename)
11591193

11601194
/* rename the file */
11611195
if (!ftp_rename(ftp, src, src_len, dest, dest_len)) {
1162-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1196+
if (*ftp->inbuf) {
1197+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1198+
}
11631199
RETURN_FALSE;
11641200
}
11651201

@@ -1185,7 +1221,9 @@ PHP_FUNCTION(ftp_delete)
11851221

11861222
/* delete the file */
11871223
if (!ftp_delete(ftp, file, file_len)) {
1188-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1224+
if (*ftp->inbuf) {
1225+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1226+
}
11891227
RETURN_FALSE;
11901228
}
11911229

@@ -1211,7 +1249,9 @@ PHP_FUNCTION(ftp_site)
12111249

12121250
/* send the site command */
12131251
if (!ftp_site(ftp, cmd, cmd_len)) {
1214-
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1252+
if (*ftp->inbuf) {
1253+
php_error_docref(NULL, E_WARNING, "%s", ftp->inbuf);
1254+
}
12151255
RETURN_FALSE;
12161256
}
12171257

ext/ftp/tests/bug79100.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
Bug #79100 (Wrong FTP error messages)
3+
--SKIPIF--
4+
<?php
5+
require 'skipif.inc';
6+
?>
7+
--FILE--
8+
<?php
9+
$bug79100 = true;
10+
require 'server.inc';
11+
12+
$ftp = ftp_connect("127.0.0.1", $port);
13+
if (!$ftp) die("Couldn't connect to the server");
14+
var_dump(ftp_login($ftp, 'user', 'pass'));
15+
var_dump(ftp_set_option($ftp, FTP_TIMEOUT_SEC, 1));
16+
ftp_systype($ftp);
17+
?>
18+
--EXPECTF--
19+
bool(true)
20+
bool(true)
21+
22+
Warning: ftp_systype(): %rConnection|Operation%r timed out in %s on line %d

ext/ftp/tests/server.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ if ($pid) {
198198
} elseif ($buf === "SYST\r\n") {
199199
if (isset($bug27809)) {
200200
fputs($s, "215 OS/400 is the remote operating system. The TCP/IP version is \"V5R2M0\"\r\n");
201+
} elseif (isset($bug79100)) {
202+
// do nothing so test hits timeout
201203
} elseif (isset($bug80901)) {
202204
fputs($s, "\r\n" . str_repeat("*", 4096) . "\r\n");
203205
} else {

0 commit comments

Comments
 (0)