ID: 41631 User updated by: david at acz dot org Reported By: david at acz dot org Status: Open Bug Type: OpenSSL related Operating System: SuSE Linux PHP Version: 5.2.3 New Comment:
I have a (partial?) fix: Index: main/streams/xp_socket.c =================================================================== RCS file: /repository/php-src/main/streams/xp_socket.c,v retrieving revision 1.33.2.2.2.4 diff -u -p -d -r1.33.2.2.2.4 xp_socket.c --- main/streams/xp_socket.c 1 Jan 2007 09:36:12 -0000 1.33.2.2.2.4 +++ main/streams/xp_socket.c 8 Jun 2007 15:55:57 -0000 @@ -103,7 +103,7 @@ retry: return didwrite; } -static void php_sock_stream_wait_for_data(php_stream *stream, php_netstream_data_t *sock TSRMLS_DC) +void php_sock_stream_wait_for_data(php_stream *stream, php_netstream_data_t *sock TSRMLS_DC) { int retval; struct timeval *ptimeout; Index: ext/openssl/xp_ssl.c =================================================================== RCS file: /repository/php-src/ext/openssl/xp_ssl.c,v retrieving revision 1.22.2.3.2.8 diff -u -p -d -r1.22.2.3.2.8 xp_ssl.c --- ext/openssl/xp_ssl.c 27 May 2007 17:05:51 -0000 1.22.2.3.2.8 +++ ext/openssl/xp_ssl.c 8 Jun 2007 15:55:57 -0000 @@ -35,6 +35,8 @@ #include <sys/select.h> #endif +void php_sock_stream_wait_for_data(php_stream *stream, php_netstream_data_t *sock TSRMLS_DC); + int php_openssl_apply_verification_policy(SSL *ssl, X509 *peer, php_stream *stream TSRMLS_DC); SSL *php_SSL_new_from_context(SSL_CTX *ctx, php_stream *stream TSRMLS_DC); int php_openssl_get_x509_list_id(void); @@ -219,6 +221,12 @@ static size_t php_openssl_sockop_read(ph php_openssl_netstream_data_t *sslsock = (php_openssl_netstream_data_t*)stream->abstract; int nr_bytes = 0; + if (sslsock->s.is_blocked) { + php_sock_stream_wait_for_data(stream, &(sslsock->s) TSRMLS_CC); + if (sslsock->s.timeout_event) + return 0; + } + if (sslsock->ssl_active) { int retry = 1; Previous Comments: ------------------------------------------------------------------------ [2007-06-08 01:15:24] david at acz dot org Description: ------------ The default socket timeout does not work with SSL streams. An strace shows PHP calls read(2) and blocks forever. Reproduce code: --------------- Create sleepforever.php: <? for(;;) sleep(1); ?> Try it with HTTP: $ php -n -r 'ini_set("default_socket_timeout", 1); fopen("http://127.0.0.1/sleepforever.php", "r");' Now try it with HTTPS: $ time php -n -r 'ini_set("default_socket_timeout", 1); fopen("https://127.0.0.1/sleepforever.php", "r");' Expected result: ---------------- Warning: fopen(http://127.0.0.1/sleepforever.php): failed to open stream: HTTP request failed! in Command line code on line 1 real 0m2.052s user 0m0.020s sys 0m0.010s Actual result: -------------- The process blocks forever. An strace shows this: connect(3, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP, revents=POLLOUT}], 1, 1000) = 1 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 fcntl64(3, F_SETFL, O_RDWR) = 0 write(3, "\200j\1\3\1\0Q\0\0\0\20\0\0\26\0\0\23\0\0\n\7\0\300\0\0"..., 108) = 108 read(3, "\26\3\1\0J\2\0", 7) = 7 *** ELIDED *** write(3, "\27\3\1\0\30N~h\231u\31S]94^\253\235\26t\324\214\t/\261"..., 29) = 29 poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 read(3, *** THIS BLOCKS FOREVER *** ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=41631&edit=1