Bug #70122 [Opn->Fbk]: stream_select() modifies array incorrectly if openssl is enabled
| From: | cmb@php.net | Date: | Tue, 22 Sep 2020 09:39:08 +0000 |
| Subject: | Bug #70122 [Opn->Fbk]: stream_select() modifies array incorrectly if openssl is enabled | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-229122@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=70122&edit=1
ID: 70122
Updated by: cmb@php.net
Reported by: jake dot zatecky at gmail dot com
Summary: stream_select() modifies array incorrectly if
openssl is enabled
-Status: Open
+Status: Feedback
Type: Bug
Package: Streams related
Operating System: Windows 7/Windows Server 2008
PHP Version: 5.6.11
-Assigned To:
+Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
Works for me as expected on Windows 10 with current PHP 7.3 and
7.4. Can you still reproduce the issue with any of the actively
supported PHP versions[1]?
[1] <https://www.php.net/supported-versions.php>
Previous Comments:
------------------------------------------------------------------------
[2015-07-23 23:47:55] jake dot zatecky at gmail dot com
Description:
------------
I have determined that the stream_select() function modifies the $read variable incorrectly when
php_openssl is loaded in more recent versions of PHP. For example, when running a listener with PHP
5.6.11 on port 8000 and using telnet, stream_select() returns the correct number of streams that
received connection (1), but both the $read and $write arrays returned are in fact empty.
This issue disappears if php_openssl is not loaded, or if you use PHP 5.6.6 (x64 thread-safe). There
are several related bugs, but it would appear that they address different issues.
I have verified this issue occurs identically on both PHP 5.6.9 and PHP 5.6.11 on a Windows 7
machine and Server 2008 R2 machine; it may occur on other operating systems as well. Both versions
are 64bit and thread-safe. I used the same .ini configuration on each of the three versions.
See the test code below to reproduce this behavior. Make sure php_openssl.dll is loaded, run the PHP
listener, and telnet the localhost port.
E.g.:
$ php listener.php
Then, in a separate terminal, run something similar to the following:
$ telnet localhost 8000
Test script:
---------------
<?php
$socket = stream_socket_server('tcp://0.0.0.0:8000', $errno, $errstr);
stream_set_blocking($socket, 0);
if (!$socket) {
echo "$errstr ($errno)\n";
} else {
$read = [$socket];
$write = [];
$except = null;
$num = stream_select($read, $write, $except, null, null);
// On PHP 5.6.9/5.6.11: int(1) and array(0) {}
// On PHP 5.6.6 : int(1) and array(1) { [0] => ... }
var_dump($num, $read);
fclose($socket);
}
Expected result:
----------------
The $read variable should contain one element:
array(1) {
[0]=>
resource(5) of type (stream)
}
This is returned using PHP 5.6.6 or when openssl is disabled.
Actual result:
--------------
On PHP 5.6.9 and PHP 5.6.11, when openssl is loaded, the following is outputted instead:
int(1)
array(0) {
}
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=70122&edit=1