mirror of
https://github.com/php/php-src.git
synced 2024-12-01 05:43:38 +08:00
better fix for bug #64770
This commit is contained in:
parent
f1e5127e7a
commit
ec4388158d
@ -601,7 +601,6 @@ static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t
|
||||
{
|
||||
zval **elem;
|
||||
php_stream *stream;
|
||||
php_socket_t this_fd = 0;
|
||||
int cnt = 0;
|
||||
|
||||
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
|
||||
@ -611,6 +610,11 @@ static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t
|
||||
zend_hash_get_current_data(Z_ARRVAL_P(stream_array), (void **) &elem) == SUCCESS;
|
||||
zend_hash_move_forward(Z_ARRVAL_P(stream_array))) {
|
||||
|
||||
/* Temporary int fd is needed for the STREAM data type on windows, passing this_fd directly to php_stream_cast()
|
||||
would eventually bring a wrong result on x64. php_stream_cast() casts to int internally, and this will leave
|
||||
the higher bits of a SOCKET variable uninitialized on systems with little endian. */
|
||||
int tmp_fd;
|
||||
|
||||
php_stream_from_zval_no_verify(stream, elem);
|
||||
if (stream == NULL) {
|
||||
continue;
|
||||
@ -620,7 +624,9 @@ static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t
|
||||
* when casting. It is only used here so that the buffered data warning
|
||||
* is not displayed.
|
||||
* */
|
||||
if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&this_fd, 1) && this_fd != -1) {
|
||||
if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&tmp_fd, 1) && tmp_fd != -1) {
|
||||
|
||||
php_socket_t this_fd = (php_socket_t)tmp_fd;
|
||||
|
||||
PHP_SAFE_FD_SET(this_fd, fds);
|
||||
|
||||
@ -638,7 +644,6 @@ static int stream_array_from_fd_set(zval *stream_array, fd_set *fds TSRMLS_DC)
|
||||
zval **elem, **dest_elem;
|
||||
php_stream *stream;
|
||||
HashTable *new_hash;
|
||||
php_socket_t this_fd = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (Z_TYPE_P(stream_array) != IS_ARRAY) {
|
||||
@ -655,6 +660,11 @@ static int stream_array_from_fd_set(zval *stream_array, fd_set *fds TSRMLS_DC)
|
||||
char *key;
|
||||
uint key_len;
|
||||
ulong num_ind;
|
||||
/* Temporary int fd is needed for the STREAM data type on windows, passing this_fd directly to php_stream_cast()
|
||||
would eventually bring a wrong result on x64. php_stream_cast() casts to int internally, and this will leave
|
||||
the higher bits of a SOCKET variable uninitialized on systems with little endian. */
|
||||
int tmp_fd;
|
||||
|
||||
|
||||
type = zend_hash_get_current_key_ex(Z_ARRVAL_P(stream_array),
|
||||
&key, &key_len, &num_ind, 0, NULL);
|
||||
@ -672,7 +682,10 @@ static int stream_array_from_fd_set(zval *stream_array, fd_set *fds TSRMLS_DC)
|
||||
* when casting. It is only used here so that the buffered data warning
|
||||
* is not displayed.
|
||||
*/
|
||||
if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&this_fd, 1) && this_fd != -1) {
|
||||
if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&tmp_fd, 1) && tmp_fd != -1) {
|
||||
|
||||
php_socket_t this_fd = (php_socket_t)tmp_fd;
|
||||
|
||||
if (PHP_SAFE_FD_ISSET(this_fd, fds)) {
|
||||
if (type == HASH_KEY_IS_LONG) {
|
||||
zend_hash_index_update(new_hash, num_ind, (void *)elem, sizeof(zval *), (void **)&dest_elem);
|
||||
|
@ -11,7 +11,8 @@ $descs = array(
|
||||
|
||||
$other_opts = array('suppress_errors' => false, 'binary_pipes' => true);
|
||||
|
||||
$p = proc_open('dir', $descs, $pipes, '.', NULL, $other_opts);
|
||||
$cmd = (substr(PHP_OS, 0, 3) == 'WIN') ? 'dir' : 'ls';
|
||||
$p = proc_open($cmd, $descs, $pipes, '.', NULL, $other_opts);
|
||||
|
||||
if (is_resource($p)) {
|
||||
$data = '';
|
||||
|
Loading…
Reference in New Issue
Block a user