]> granicus.if.org Git - php/commitdiff
Fixed bug #46024 (stream_select() doesn't return the correct number)
authorArnaud Le Blanc <lbarnaud@php.net>
Tue, 4 Nov 2008 00:42:19 +0000 (00:42 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Tue, 4 Nov 2008 00:42:19 +0000 (00:42 +0000)
ext/standard/streamsfuncs.c
ext/standard/tests/streams/bug46024.phpt [new file with mode: 0644]

index 93ac9306dee1894ab033c25ff5bf0f1ca899c1ad..d5552a01cdef11ebe5d92212b393d7957b025e28 100644 (file)
@@ -836,6 +836,12 @@ PHP_FUNCTION(stream_select)
 
                retval = stream_array_emulate_read_fd_set(r_array TSRMLS_CC);
                if (retval > 0) {
+                       if (w_array != NULL) {
+                               zend_hash_clean(Z_ARRVAL_P(w_array));
+                       }
+                       if (e_array != NULL) {
+                               zend_hash_clean(Z_ARRVAL_P(e_array));
+                       }
                        RETURN_LONG(retval);
                }
        }
diff --git a/ext/standard/tests/streams/bug46024.phpt b/ext/standard/tests/streams/bug46024.phpt
new file mode 100644 (file)
index 0000000..5dd1908
--- /dev/null
@@ -0,0 +1,46 @@
+--TEST--
+Bug #46024 stream_select() doesn't return the correct number
+--SKIPIF--
+<?php if (!getenv('TEST_PHP_EXECUTABLE')) die("TEST_PHP_EXECUTABLE not defined"); ?>
+--FILE--
+<?php
+$php = getenv('TEST_PHP_EXECUTABLE'); 
+$pipes = array();
+$proc = proc_open(
+       "$php -n -i"
+       ,array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'))
+       ,$pipes, dirname(__FILE__), array(), array('binary_pipes' => true)
+);
+var_dump($proc);
+if (!$proc) {
+       exit(1);
+}
+$r = array($pipes[1]);
+$w = array($pipes[0]);
+$e = null;
+$ret = stream_select($r, $w, $e, 1);
+var_dump($ret === (count($r) + count($w)));
+fread($pipes[0], 1);
+
+$r = array($pipes[1]);
+$w = array($pipes[0]);
+$e = null;
+$ret = stream_select($r, $w, $e, 1);
+var_dump($ret === (count($r) + count($w)));
+
+
+foreach($pipes as $pipe) {
+       fclose($pipe);
+}
+proc_terminate($proc);
+if (defined('SIGKILL')) {
+       proc_terminate($proc, SIGKILL);
+} else {
+       proc_terminate($proc);
+}
+proc_close($proc);
+?>
+--EXPECTF--
+resource(%d) of type (process)
+bool(true)
+bool(true)