srinatar Tue, 28 Jul 2009 19:28:08 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=286465
Log: - 48182 ssl handshake fails during asynchronous socket connection Changed paths: U php/php-src/branches/PHP_5_2/NEWS A php/php-src/branches/PHP_5_2/ext/openssl/tests/bug48182.phpt U php/php-src/branches/PHP_5_2/ext/openssl/xp_ssl.c U php/php-src/branches/PHP_5_3/NEWS A php/php-src/branches/PHP_5_3/ext/openssl/tests/bug48182.phpt U php/php-src/branches/PHP_5_3/ext/openssl/xp_ssl.c A php/php-src/trunk/ext/openssl/tests/bug48182.phpt U php/php-src/trunk/ext/openssl/xp_ssl.c
Modified: php/php-src/branches/PHP_5_2/NEWS =================================================================== --- php/php-src/branches/PHP_5_2/NEWS 2009-07-28 19:16:02 UTC (rev 286464) +++ php/php-src/branches/PHP_5_2/NEWS 2009-07-28 19:28:08 UTC (rev 286465) @@ -65,6 +65,8 @@ (Paul Richards, Kalle) - Fixed bug #48774 (SIGSEGVs when using curl_copy_handle()). (Sriram Natarajan) +- Fixed bug #48182 (ssl handshake fails during asynchronous socket connection). + (Sriram Natarajan) 17 Jun 2009, PHP 5.2.10 - Updated timezone database to version 2009.9 (2009i) (Derick) Added: php/php-src/branches/PHP_5_2/ext/openssl/tests/bug48182.phpt =================================================================== --- php/php-src/branches/PHP_5_2/ext/openssl/tests/bug48182.phpt (rev 0) +++ php/php-src/branches/PHP_5_2/ext/openssl/tests/bug48182.phpt 2009-07-28 19:28:08 UTC (rev 286465) @@ -0,0 +1,92 @@ +--TEST-- +#48182,ssl handshake fails during asynchronous socket connection +--SKIPIF-- +<?php +if (!extension_loaded("openssl")) die("skip, openssl required"); +if (!extension_loaded("pcntl")) die("skip, pcntl required"); +if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip"); +?> +--FILE-- +<?php + +function ssl_server($port) { + $host = 'ssl://127.0.0.1'.':'.$port; + $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + $data = "Sending bug48182\n"; + + $pem = dirname(__FILE__) . '/bug46127.pem'; + $ssl_params = array( 'verify_peer' => false, 'allow_self_signed' => true, 'local_cert' => $pem); + $ssl = array('ssl' => $ssl_params); + + $context = stream_context_create($ssl); + $sock = stream_socket_server($host, $errno, $errstr, $flags, $context); + if (!$sock) return false; + + $link = stream_socket_accept($sock); + if (!$link) return false; // bad link? + + $r = array($link); + $w = array(); + $e = array(); + if (stream_select($r, $w, $e, 0, 1000) != 0) + $data .= fread($link, 8192); + + $r = array(); + $w = array($link); + if (stream_select($r, $w, $e, 0, 1000) != 0) + $wrote = fwrite($link, $data, strlen($data)); + + // close stuff + fclose($link); + fclose($sock); + + exit; +} + +function ssl_async_client($port) { + $host = 'ssl://127.0.0.1'.':'.$port; + $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; + $data = "Sending data over to SSL server in async mode with contents like Hello World\n"; + + $socket = stream_socket_client($host, $errno, $errstr, 10, $flags); + stream_set_blocking($socket, 0); + + while ($data) { + $wrote = fwrite($socket, $data, strlen($data)); + $data = substr($data, $wrote); + } + + $r = array($socket); + $w = array(); + $e = array(); + if (stream_select($r, $w, $e, 0, 10) != 0) + { + $data .= fread($socket, 1024); + } + + echo "$data"; + + fclose($socket); +} + +echo "Running bug48182\n"; + +$port = rand(15000, 32000); + +$pid = pcntl_fork(); +if ($pid == 0) { // child + ssl_server($port); + exit; +} + +// client or failed +sleep(1); +ssl_async_client($port); + +pcntl_waitpid($pid, $status); + +?> +--EXPECTF-- +Running bug48182 +Sending bug48182 +Sending data over to SSL server in async mode with contents like Hello World Modified: php/php-src/branches/PHP_5_2/ext/openssl/xp_ssl.c =================================================================== --- php/php-src/branches/PHP_5_2/ext/openssl/xp_ssl.c 2009-07-28 19:16:02 UTC (rev 286464) +++ php/php-src/branches/PHP_5_2/ext/openssl/xp_ssl.c 2009-07-28 19:28:08 UTC (rev 286465) @@ -685,7 +685,11 @@ * we notice that the connect has actually been established */ php_stream_socket_ops.set_option(stream, option, value, ptrparam TSRMLS_CC); - if (xparam->outputs.returncode == 0 && sslsock->enable_on_connect) { + if ((sslsock->enable_on_connect) && + ((xparam->outputs.returncode == 0) || + (xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC && + xparam->outputs.returncode == 1 && xparam->outputs.error_code == EINPROGRESS))) + { if (php_stream_xport_crypto_setup(stream, sslsock->method, NULL TSRMLS_CC) < 0 || php_stream_xport_crypto_enable(stream, 1 TSRMLS_CC) < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to enable crypto"); Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2009-07-28 19:16:02 UTC (rev 286464) +++ php/php-src/branches/PHP_5_3/NEWS 2009-07-28 19:28:08 UTC (rev 286465) @@ -73,6 +73,8 @@ (Kalle, Rick Yorgason) - Fixed bug #48774 (SIGSEGVs when using curl_copy_handle()). (Sriram Natarajan) +- Fixed bug #48182 (ssl handshake fails during asynchronous socket connection). + (Sriram Natarajan) 30 Jun 2009, PHP 5.3.0 - Upgraded bundled PCRE to version 7.9. (Nuno) Added: php/php-src/branches/PHP_5_3/ext/openssl/tests/bug48182.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/openssl/tests/bug48182.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/openssl/tests/bug48182.phpt 2009-07-28 19:28:08 UTC (rev 286465) @@ -0,0 +1,92 @@ +--TEST-- +#48182,ssl handshake fails during asynchronous socket connection +--SKIPIF-- +<?php +if (!extension_loaded("openssl")) die("skip, openssl required"); +if (!extension_loaded("pcntl")) die("skip, pcntl required"); +if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip"); +?> +--FILE-- +<?php + +function ssl_server($port) { + $host = 'ssl://127.0.0.1'.':'.$port; + $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + $data = "Sending bug48182\n"; + + $pem = dirname(__FILE__) . '/bug46127.pem'; + $ssl_params = array( 'verify_peer' => false, 'allow_self_signed' => true, 'local_cert' => $pem); + $ssl = array('ssl' => $ssl_params); + + $context = stream_context_create($ssl); + $sock = stream_socket_server($host, $errno, $errstr, $flags, $context); + if (!$sock) return false; + + $link = stream_socket_accept($sock); + if (!$link) return false; // bad link? + + $r = array($link); + $w = array(); + $e = array(); + if (stream_select($r, $w, $e, 0, 1000) != 0) + $data .= fread($link, 8192); + + $r = array(); + $w = array($link); + if (stream_select($r, $w, $e, 0, 1000) != 0) + $wrote = fwrite($link, $data, strlen($data)); + + // close stuff + fclose($link); + fclose($sock); + + exit; +} + +function ssl_async_client($port) { + $host = 'ssl://127.0.0.1'.':'.$port; + $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; + $data = "Sending data over to SSL server in async mode with contents like Hello World\n"; + + $socket = stream_socket_client($host, $errno, $errstr, 10, $flags); + stream_set_blocking($socket, 0); + + while ($data) { + $wrote = fwrite($socket, $data, strlen($data)); + $data = substr($data, $wrote); + } + + $r = array($socket); + $w = array(); + $e = array(); + if (stream_select($r, $w, $e, 0, 10) != 0) + { + $data .= fread($socket, 1024); + } + + echo "$data"; + + fclose($socket); +} + +echo "Running bug48182\n"; + +$port = rand(15000, 32000); + +$pid = pcntl_fork(); +if ($pid == 0) { // child + ssl_server($port); + exit; +} + +// client or failed +sleep(1); +ssl_async_client($port); + +pcntl_waitpid($pid, $status); + +?> +--EXPECTF-- +Running bug48182 +Sending bug48182 +Sending data over to SSL server in async mode with contents like Hello World Modified: php/php-src/branches/PHP_5_3/ext/openssl/xp_ssl.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/openssl/xp_ssl.c 2009-07-28 19:16:02 UTC (rev 286464) +++ php/php-src/branches/PHP_5_3/ext/openssl/xp_ssl.c 2009-07-28 19:28:08 UTC (rev 286465) @@ -672,7 +672,11 @@ * we notice that the connect has actually been established */ php_stream_socket_ops.set_option(stream, option, value, ptrparam TSRMLS_CC); - if (xparam->outputs.returncode == 0 && sslsock->enable_on_connect) { + if ((sslsock->enable_on_connect) && + ((xparam->outputs.returncode == 0) || + (xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC && + xparam->outputs.returncode == 1 && xparam->outputs.error_code == EINPROGRESS))) + { if (php_stream_xport_crypto_setup(stream, sslsock->method, NULL TSRMLS_CC) < 0 || php_stream_xport_crypto_enable(stream, 1 TSRMLS_CC) < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to enable crypto"); Added: php/php-src/trunk/ext/openssl/tests/bug48182.phpt =================================================================== --- php/php-src/trunk/ext/openssl/tests/bug48182.phpt (rev 0) +++ php/php-src/trunk/ext/openssl/tests/bug48182.phpt 2009-07-28 19:28:08 UTC (rev 286465) @@ -0,0 +1,92 @@ +--TEST-- +#48182,ssl handshake fails during asynchronous socket connection +--SKIPIF-- +<?php +if (!extension_loaded("openssl")) die("skip, openssl required"); +if (!extension_loaded("pcntl")) die("skip, pcntl required"); +if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip"); +?> +--FILE-- +<?php + +function ssl_server($port) { + $host = 'ssl://127.0.0.1'.':'.$port; + $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; + $data = "Sending bug48182\n"; + + $pem = dirname(__FILE__) . '/bug46127.pem'; + $ssl_params = array( 'verify_peer' => false, 'allow_self_signed' => true, 'local_cert' => $pem); + $ssl = array('ssl' => $ssl_params); + + $context = stream_context_create($ssl); + $sock = stream_socket_server($host, $errno, $errstr, $flags, $context); + if (!$sock) return false; + + $link = stream_socket_accept($sock); + if (!$link) return false; // bad link? + + $r = array($link); + $w = array(); + $e = array(); + if (stream_select($r, $w, $e, 0, 1000) != 0) + $data .= fread($link, 8192); + + $r = array(); + $w = array($link); + if (stream_select($r, $w, $e, 0, 1000) != 0) + $wrote = fwrite($link, $data, strlen($data)); + + // close stuff + fclose($link); + fclose($sock); + + exit; +} + +function ssl_async_client($port) { + $host = 'ssl://127.0.0.1'.':'.$port; + $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT; + $data = "Sending data over to SSL server in async mode with contents like Hello World\n"; + + $socket = stream_socket_client($host, $errno, $errstr, 10, $flags); + stream_set_blocking($socket, 0); + + while ($data) { + $wrote = fwrite($socket, $data, strlen($data)); + $data = substr($data, $wrote); + } + + $r = array($socket); + $w = array(); + $e = array(); + if (stream_select($r, $w, $e, 0, 10) != 0) + { + $data .= fread($socket, 1024); + } + + echo "$data"; + + fclose($socket); +} + +echo "Running bug48182\n"; + +$port = rand(15000, 32000); + +$pid = pcntl_fork(); +if ($pid == 0) { // child + ssl_server($port); + exit; +} + +// client or failed +sleep(1); +ssl_async_client($port); + +pcntl_waitpid($pid, $status); + +?> +--EXPECTF-- +Running bug48182 +Sending bug48182 +Sending data over to SSL server in async mode with contents like Hello World Modified: php/php-src/trunk/ext/openssl/xp_ssl.c =================================================================== --- php/php-src/trunk/ext/openssl/xp_ssl.c 2009-07-28 19:16:02 UTC (rev 286464) +++ php/php-src/trunk/ext/openssl/xp_ssl.c 2009-07-28 19:28:08 UTC (rev 286465) @@ -671,7 +671,11 @@ * we notice that the connect has actually been established */ php_stream_socket_ops.set_option(stream, option, value, ptrparam TSRMLS_CC); - if (xparam->outputs.returncode == 0 && sslsock->enable_on_connect) { + if ((sslsock->enable_on_connect) && + ((xparam->outputs.returncode == 0) || + (xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC && + xparam->outputs.returncode == 1 && xparam->outputs.error_code == EINPROGRESS))) + { if (php_stream_xport_crypto_setup(stream, sslsock->method, NULL TSRMLS_CC) < 0 || php_stream_xport_crypto_enable(stream, 1 TSRMLS_CC) < 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to enable crypto");
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php