]> granicus.if.org Git - php/commitdiff
Fix #77151 ftp_close(): SSL_read on shutdown
authorRemi Collet <remi@remirepo.net>
Thu, 15 Nov 2018 07:58:08 +0000 (08:58 +0100)
committerRemi Collet <remi@php.net>
Tue, 20 Nov 2018 10:18:34 +0000 (11:18 +0100)
Regression introduced in fix for #76972

only display the error message when sslerror
or if errno is set (for SSL_ERROR_SYSCALL case)

ext/ftp/ftp.c

index 88553b969c29ce8de87900c97649136d60be5306..44e3bf2510024c5e1b120ad6a5920727d0e9d3ac 100644 (file)
@@ -1770,10 +1770,10 @@ static void ftp_ssl_shutdown(ftpbuf_t *ftp, php_socket_t fd, SSL *ssl_handle) {
                done = 0;
        }
 
-       while (!done) {
-               if (data_available(ftp, fd)) {
-                       ERR_clear_error();
-                       nread = SSL_read(ssl_handle, buf, sizeof(buf));
+       while (!done && data_available(ftp, fd)) {
+               ERR_clear_error();
+               nread = SSL_read(ssl_handle, buf, sizeof(buf));
+               if (nread <= 0) {
                        err = SSL_get_error(ssl_handle, nread);
                        switch (err) {
                                case SSL_ERROR_NONE: /* this is not an error */
@@ -1791,9 +1791,11 @@ static void ftp_ssl_shutdown(ftpbuf_t *ftp, php_socket_t fd, SSL *ssl_handle) {
                                        break;
                                default:
                                        if ((sslerror = ERR_get_error())) {
-                                           ERR_error_string_n(sslerror, buf, sizeof(buf));
+                                               ERR_error_string_n(sslerror, buf, sizeof(buf));
+                                               php_error_docref(NULL, E_WARNING, "SSL_read on shutdown: %s", buf);
+                                       } else if (errno) {
+                                               php_error_docref(NULL, E_WARNING, "SSL_read on shutdown: %s (%d)", strerror(errno), errno);
                                        }
-                                       php_error_docref(NULL, E_WARNING, "SSL_read on shutdown: %s (%d)", (sslerror ? buf : strerror(errno)), errno);
                                        done = 1;
                                        break;
                        }