diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index a11aa323c1c0a..b2fc19140be25 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -1582,7 +1582,7 @@ my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len) /* {{{ data_available */ int -data_available(ftpbuf_t *ftp, php_socket_t s) +data_available(ftpbuf_t *ftp, php_socket_t s, zend_bool ignore_timeout) { int n; @@ -1590,6 +1590,7 @@ data_available(ftpbuf_t *ftp, php_socket_t s) if (n < 1) { char buf[256]; if (n == 0) { + if (ignore_timeout) return 0; #ifdef PHP_WIN32 _set_errno(ETIMEDOUT); #else @@ -1919,7 +1920,7 @@ static void ftp_ssl_shutdown(ftpbuf_t *ftp, php_socket_t fd, SSL *ssl_handle) { done = 0; } - while (!done && data_available(ftp, fd)) { + while (!done && data_available(ftp, fd, 1)) { ERR_clear_error(); nread = SSL_read(ssl_handle, buf, sizeof(buf)); if (nread <= 0) { @@ -2174,7 +2175,7 @@ ftp_nb_continue_read(ftpbuf_t *ftp) data = ftp->data; /* check if there is already more data */ - if (!data_available(ftp, data->fd)) { + if (!data_available(ftp, data->fd, 0)) { return PHP_FTP_MOREDATA; } diff --git a/ext/ftp/tests/bug78374.phpt b/ext/ftp/tests/bug78374.phpt new file mode 100644 index 0000000000000..695876598b6e6 --- /dev/null +++ b/ext/ftp/tests/bug78374.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #78374 (Warning when closing FTPS connection after FTP_PUT) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) diff --git a/ext/ftp/tests/server.inc b/ext/ftp/tests/server.inc index b77bed904f25c..516271b1b47b7 100644 --- a/ext/ftp/tests/server.inc +++ b/ext/ftp/tests/server.inc @@ -236,6 +236,10 @@ if ($pid) { continue; } + if ((!empty($ssl)) && (!stream_socket_enable_crypto($fs, true, STREAM_CRYPTO_METHOD_TLS_SERVER, $s))) { + die("SSLv23 handshake failed.\n"); + } + $data = stream_get_contents($fs); $orig = file_get_contents(dirname(__FILE__).'/'.$m[1]);