diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 3f9a78a81f0f4..7ccb13ffa77f4 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -1605,7 +1605,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, bool silent) { int n; @@ -1613,6 +1613,9 @@ data_available(ftpbuf_t *ftp, php_socket_t s) if (n < 1) { char buf[256]; if (n == 0) { + if (silent) { + return 0; + } #ifdef PHP_WIN32 _set_errno(ETIMEDOUT); #else @@ -1938,7 +1941,9 @@ static void ftp_ssl_shutdown(ftpbuf_t *ftp, php_socket_t fd, SSL *ssl_handle) { done = 0; } - while (!done && data_available(ftp, fd)) { + /* Don't report timeouts on the control channel if we're negotiating a shutdown already. + * Some servers don't put a final response. */ + while (!done && data_available(ftp, fd, true)) { ERR_clear_error(); nread = SSL_read(ssl_handle, buf, sizeof(buf)); if (nread <= 0) { @@ -2198,7 +2203,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, false)) { return PHP_FTP_MOREDATA; }