|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2007-05-24 13:09 UTC] n dot escuder at intra-links dot com
Description:
------------
When creating an socket server in ssl mode stream_select don't work.
In PHP 5.2.1 all work fine the bug is in PHP 5.2.2.
Reproduce code:
---------------
server.php:
$options = array( "ssl" => array( "allow_self_signed" => true, "verify_peer" => false, "local_cert" => "/www/conf/ssl/server.pem" ) );
$context = stream_context_create();
stream_context_set_option( $context, $options );
$s = stream_socket_server( "ssl://0.0.0.0:6310", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context );
while ( 1 ) {
$read = array( $s );
$wr = null;
$ed = null;
if ( stream_select( $read, $wr, $ed, 0, 500 ) > 0 ) {
echo "ACCEPT\n";
}
}
client.php:
$s = stream_socket_client( "ssl://localhost:6310" );
$s->write("toto\r\n\r\n");
sleep( 1 );
Expected result:
----------------
when running server.php we must go "ACCEPT" onto the screen.
Actual result:
--------------
nothing
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 11:00:01 2025 UTC |
Linux zelda.intra-links.dev 2.6.21.4-atl-smp #1 SMP Mon Jun 25 20:28:57 CEST 2007 x86_64 GNU/Linux OpenSSL 0.9.8e 23 Feb 2007 I omit to say that PHP is the CLI Version. Build script of PHP : export EXTENSION_DIR=/usr/lib/php/extensions && ARGS="--prefix=/usr \ --sysconfdir=/etc \ --with-config-file-path=/etc \ --with-zlib-dir=/usr/lib \ --with-pear \ --enable-dom \ --enable-overload \ --enable-pcntl \ --enable-pdo \ --enable-simplexml \ --enable-zip \ --enable-json \ --with-bz2=shared \ --with-curl=shared \ --with-fam=shared \ --with-gettext=shared \ --with-iconv=shared \ --with-imap=shared \ --with-imap-ssl=shared \ --with-mysql=shared \ --with-openssl=shared \ --with-pdo-mysql=shared \ --with-pdo-sqlite=/usr \ --with-xml=shared \ --with-simplexml=shared \ --with-xmlreader=shared \ --with-xmlwriter=shared \ --enable-bcmath=shared \ --enable-calendar=shared \ --enable-ctype=shared \ --enable-exif=shared \ --enable-ftp=shared \ --enable-hash=shared \ --enable-mbstring=shared \ --enable-sockets=shared \ --enable-tokenizer=shared \ --enable-xmlreader=shared \ --enable-xmlwriter=shared \ --without-sqlite \ --disable-cgi" && ./configure $ARGS && make && make install It's an LFS OS. PHP is the core of the plateform it manage services and events between processs with RPC and more... I can give you an access if you need it.I try without any certificat and the same problem appear. I try launch server.php with php-5.2-dev and client with php-5.2.1 and the same problem appear. So i decide to lookup into the code. A strange result append i try to explain : code in ext/standard/streamsfuncs.c : retval = php_select(max_fd+1, &rfds, &wfds, &efds, tv_p); printf("%d %d\n", max_fd, retval ); if (retval == -1) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to select [%d]: %s (max_fd=%d)", errno, strerror(errno), max_fd); RETURN_FALSE; } printf("%d\n", retval ); if (r_array != NULL) stream_array_from_fd_set(r_array, &rfds TSRMLS_CC); if (w_array != NULL) stream_array_from_fd_set(w_array, &wfds TSRMLS_CC); if (e_array != NULL) stream_array_from_fd_set(e_array, &efds TSRMLS_CC); printf("%d\n", retval ); RETURN_LONG(retval); As you can see i had three printf for debug :o) I add an var_dump to the result of stream_select in server.php The strange result i have after i launch client.php is : 3 1 -> First printf with max_fd and retval 1 -> Second printf with retval 0 -> Third printf with retval but the value as changed .... int(0) -> The var_dump in server.php So the value change between the second and third printf ;o) I hope this helpI'm using 5.2.5 and having similar issues with stream_select and a tcp stream_socket_server. I'm using NULL for the timeout, so that the function call shouldn't return until a stream is available. $sock = stream_socket_server("tcp://".$address.":".$port, $errno, $errstr); $ready = stream_select($reads, $writes, $e = NULL, NULL); stream_select is returning when there is a stream available, but the return value is 0 (I've verified that $ready == 0 and $ready !== false).After searching in the change since PHP 5.2.1 I found the change who break this. The change is in the IMAP extension : diff -Naur php-5.2.5/ext/imap/config.m4 php-5.2.5-atl/ext/imap/config.m4 --- php-5.2.5/ext/imap/config.m4 2007-02-11 10:25:32.000000000 +0100 +++ php-5.2.5-atl/ext/imap/config.m4 2007-01-23 13:37:21.000000000 +0100 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4,v 1.69.4.7 2007/02/11 09:25:32 tony2001 Exp $ +dnl $Id: config.m4,v 1.69.4.6 2007/01/23 12:37:21 bjori Exp $ dnl AC_DEFUN([IMAP_INC_CHK],[if test -r "$i$1/c-client.h"; then @@ -137,7 +137,7 @@ if test "$ac_cv_utf8_mime2text" = "new"; then AC_DEFINE(HAVE_NEW_MIME2TEXT, 1, [Whether utf8_mime2text() has new signature]) fi - CFLAGS=$old_CFLAGS + CFLAGS=$old_CPPFLAGS old_CFLAGS=$CFLAGS CFLAGS="-I$IMAP_INC_DIR" @@ -152,7 +152,7 @@ ac_cv_u8t_canonical=no ]) ) - CFLAGS=$old_CFLAGS + CFLAGS=$old_CPPFLAGS if test "$ac_cv_u8t_canonical" = "no" && test "$ac_cv_utf8_mime2text" = "new"; then AC_MSG_ERROR([utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.]) I don't understand why this change break select on ssl but i think it break something in configure. If i revert this change on php-5.2.5 code tree and i do an autoreconf command and compile the code, all works fine.