Edit report at https://bugs.php.net/bug.php?id=36103&edit=1
ID: 36103 Comment by: hessemanj2100 at gmail dot com Reported by: rebe at unit01 dot net Summary: ftp ssl connection fails during login Status: No Feedback Type: Bug Package: FTP related Operating System: linux PHP Version: 5.1.2 Assigned To: tony2001 Block user comment: N Private report: N New Comment: Here we are at versions 5.3.25 and 5.4.15 and this bug still exists? Come on, this is PHP for crying out loud. The most popular scripting language on the web. Please implement this patch already that "erez dot h at zend dot com" made. It works perfectly because I tried it. Just a simple patch that decides how to handle certain SSL errors. It sucks having to patch ftp.c every time I want to compile PHP with FTP support. You (PHP development team) are seriously slacking. How hard can it be? Add it to the source tree already! Previous Comments: ------------------------------------------------------------------------ [2012-12-12 08:01:11] erez dot h at zend dot com Hi Tony I think this is the right place to write the comments since i am experiencing all the of the same issues as mentioned on comment [2006-01-20 15:32 UTC] rebe at unit01 dot net. The main difference is that it appear on our windows php and not linux. Also need to mention the patch is used from comments 1. [2006-01-24 00:38 UTC] rebe at unit01 dot net 2. [2007-10-12 14:21 UTC] contact dot removethis at deciacco dot com The test case is as follows: (http://php.net/manual/en/function.ftp-ssl- connect.php) <?php // set up basic ssl connection $conn_id = ftp_ssl_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); echo ftp_pwd($conn_id); // / // close the ssl connection ftp_close($conn_id); ?> And I will pass this to Dimitry as well. Thanks ------------------------------------------------------------------------ [2012-12-11 16:00:45] tony2...@php.net @erez dot h at zend dot com I guess it would be better to create a new bug report and add an up to date reproduce case while you're at it. Adding some more explanations to the patch would be a good idea, too. You can also go an other way and send your patch directly to Dmitry for review, dmi...@zend.com/dmi...@php.net I mean. ------------------------------------------------------------------------ [2012-12-11 15:15:58] erez dot h at zend dot com we still have this issue on windows php build 5.3.19 and 5.4.9 so we implemented this patch which solve the issue. please see if you can add to future versions. diff -ruN php-5.3.19.orig/ext/ftp/ftp.c php-5.3.19/ext/ftp/ftp.c --- php-5.3.19.orig/ext/ftp/ftp.c 2012-11-21 22:07:23.000000000 +0200 +++ php-5.3.19/ext/ftp/ftp.c 2012-12-11 16:49:21.359682714 +0200 @@ -241,6 +241,7 @@ int ftp_login(ftpbuf_t *ftp, const char *user, const char *pass TSRMLS_DC) { + int errcode; #if HAVE_OPENSSL_EXT SSL_CTX *ctx = NULL; #endif @@ -289,13 +290,27 @@ } SSL_set_fd(ftp->ssl_handle, ftp->fd); - - if (SSL_connect(ftp->ssl_handle) <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "SSL/TLS handshake failed"); - SSL_shutdown(ftp->ssl_handle); - return 0; - } - + + do { + errcode = SSL_connect(ftp->ssl_handle); + switch (SSL_get_error (ftp->ssl_handle, errcode)) { + case SSL_ERROR_NONE: + errcode = 1; + break; + case SSL_ERROR_WANT_WRITE: + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_X509_LOOKUP: + errcode = 0; + break; + default: + /* true error happened */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "SSL/TLS handshake failed"); + SSL_shutdown(ftp->ssl_handle); + return 0; + break; + } + } while(errcode == 0 && !SSL_is_init_finished(ftp- >ssl_handle)); + ftp->ssl_active = 1; if (!ftp->old_ssl) { @@ -1493,6 +1508,7 @@ php_sockaddr_storage addr; socklen_t size; + int errcode; #if HAVE_OPENSSL_EXT SSL_CTX *ctx; #endif @@ -1537,11 +1553,26 @@ SSL_copy_session_id(data->ssl_handle, ftp->ssl_handle); } - if (SSL_connect(data->ssl_handle) <= 0) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_accept: SSL/TLS handshake failed"); - SSL_shutdown(data->ssl_handle); - return 0; - } + + do { + errcode = SSL_connect(data->ssl_handle); + switch (SSL_get_error (data->ssl_handle, errcode)) { + case SSL_ERROR_NONE: + errcode = 1; + break; + case SSL_ERROR_WANT_WRITE: + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_X509_LOOKUP: + errcode = 0; + break; + default: + /* true error happened */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "data_accept: SSL/TLS handshake failed"); + SSL_shutdown(data->ssl_handle); + return 0; + break; + } + } while(errcode == 0 && !SSL_is_init_finished(data- >ssl_handle)); data->ssl_active = 1; } ------------------------------------------------------------------------ [2008-07-21 01:00:01] php-bugs at lists dot php dot net No feedback was provided for this bug for over a week, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open". ------------------------------------------------------------------------ [2008-07-13 16:02:08] j...@php.net Please try using this CVS snapshot: http://snaps.php.net/php5.2-latest.tar.gz For Windows (zip): http://snaps.php.net/win32/php5.2-win32-latest.zip For Windows (installer): http://snaps.php.net/win32/php5.2-win32-installer-latest.msi ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=36103 -- Edit this bug report at https://bugs.php.net/bug.php?id=36103&edit=1