ID: 42682 User updated by: Slig at free dot fr Reported By: Slig at free dot fr -Status: Feedback +Status: Open Bug Type: Streams related Operating System: linux-64 PHP Version: 5CVS-2007-10-11 (snap) New Comment:
No, just setting it to 0 doesn't work. And margus is true, using 'long this_fd;' it works (with or without setting it to 0). I don't say it's the right solution, perhaps it's more something to change in php_stream_cast(), i don't know. Previous Comments: ------------------------------------------------------------------------ [2007-10-12 10:20:28] [EMAIL PROTECTED] Try this patch (just manually change the 2 lines :): Index: streamsfuncs.c =================================================================== RCS file: /repository/php-src/ext/standard/streamsfuncs.c,v retrieving revision 1.58.2.6.2.15.2.4 diff -u -a -r1.58.2.6.2.15.2.4 streamsfuncs.c --- streamsfuncs.c 10 Oct 2007 12:58:41 -0000 1.58.2.6.2.15.2.4 +++ streamsfuncs.c 12 Oct 2007 10:19:55 -0000 @@ -573,7 +573,7 @@ { zval **elem; php_stream *stream; - php_socket_t this_fd; + php_socket_t this_fd = 0; int cnt = 0; if (Z_TYPE_P(stream_array) != IS_ARRAY) { @@ -610,7 +610,7 @@ zval **elem, **dest_elem; php_stream *stream; HashTable *new_hash; - php_socket_t this_fd; + php_socket_t this_fd = 0; int ret = 0; if (Z_TYPE_P(stream_array) != IS_ARRAY) { ------------------------------------------------------------------------ [2007-10-12 10:10:34] [EMAIL PROTECTED] But it won't work in future. I tried to figure out why changing that int to long would help but AFAICT it's really supposed to be int since everything else using this_fd is expecting it to be int.. ------------------------------------------------------------------------ [2007-10-11 18:50:17] margus at zone dot ee I was hit by the same annoying bug (CentOS 4.5/x64/PHP5.1.6 & 5.2.3) After debugging PHP stream_select() I found out that system's select() returns correct number but this value get's mysteriously set to zero (memory is overwritten?) a few steps before returning it to PHP script. Anyway, the cure for me was to change an variable type from int to long and explicitly reset it to 0. This patch works for both PHP 5.1 and 5.2: --- ext/standard/streamsfuncs.c.orig 2007-10-09 16:21:30.000000000 +0300 +++ ext/standard/streamsfuncs.c 2007-10-09 16:21:41.000000000 +0300 @@ -608,7 +608,7 @@ zval **elem, **dest_elem; php_stream *stream; HashTable *new_hash; - int this_fd, ret = 0; + long this_fd = 0, ret = 0; if (Z_TYPE_P(stream_array) != IS_ARRAY) { return 0; ------------------------------------------------------------------------ [2007-10-11 16:29:15] Slig at free dot fr Sorry, still the same with the last snapshot on amd64/dual core xeon on debian etch : it works without --with-openssl but don't work when built using --with-openssl :( ------------------------------------------------------------------------ [2007-09-21 00:06:00] Slig at free dot fr I tested today on a dual dual-core-xeon on current Fedora 7 x86_64, first with current php and current openssl, then building php6 from the source : same result, it give the expected result without openssl, but return 0 when build with --with-openssl when there is a descriptor to read. Note: If i use as workaround 'while($nb>0 || count($r)>0){' and reduce the read buffer ( fread($handle,30); for example), then i see that after the first read the value returned by stream_select is ok... but it shows another bug (#42720) :d ------------------------------------------------------------------------ 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 http://bugs.php.net/42682 -- Edit this bug report at http://bugs.php.net/?id=42682&edit=1