]> granicus.if.org Git - php/commitdiff
Fixes to various stream cast on win64
authorAnatol Belski <ab@php.net>
Wed, 19 Mar 2014 05:26:54 +0000 (06:26 +0100)
committerAnatol Belski <ab@php.net>
Wed, 19 Mar 2014 05:33:46 +0000 (06:33 +0100)
This fixes further issues on win64 with casts from the streams.
Sockets/descriptors handling was unitized. This has an impact only on
win64, php_socket_t otherwise can be feed back to int datatype.

ext/bz2/bz2.c
ext/fileinfo/libmagic/funcs.c
ext/standard/proc_open.c
ext/standard/streamsfuncs.c
ext/zlib/zlib_fopen_wrapper.c
main/streams/plain_wrapper.c

index 2f440597bac31c67083468f0a9d8843577b38bd2..cc845584f0277e84325f33abfc62add49ac46c32 100644 (file)
@@ -31,6 +31,7 @@
 #include "ext/standard/file.h"
 #include "ext/standard/info.h"
 #include "ext/standard/php_string.h"
+#include "main/php_network.h"
 
 /* for fileno() */
 #include <stdio.h>
@@ -245,7 +246,7 @@ PHP_BZ2_API php_stream *_php_stream_bz2open(php_stream_wrapper *wrapper,
                stream = php_stream_open_wrapper(path, mode, options | STREAM_WILL_CAST, opened_path);
        
                if (stream) {
-                       int fd;
+                       php_socket_t fd;
                        if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD, (void **) &fd, REPORT_ERRORS)) {
                                bz_file = BZ2_bzdopen(fd, mode);
                        }
@@ -394,7 +395,7 @@ static PHP_FUNCTION(bzopen)
                                                                        NULL);
        } else if (Z_TYPE_PP(file) == IS_RESOURCE) {
                /* If it is a resource, than its a stream resource */
-               int fd;
+               php_socket_t fd;
                int stream_mode_len;
 
                php_stream_from_zval(stream, file);
index f17f36536db744dcda1da58dcc5964aed05827c9..e1aa7b9c3decf2a7810393d03a48b2889c70a8d1 100644 (file)
@@ -49,6 +49,9 @@ FILE_RCSID("@(#)$File: funcs.c,v 1.67 2014/02/12 23:20:53 christos Exp $")
 # define SIZE_MAX ((size_t) -1) 
 #endif
 
+#include "php.h"
+#include "main/php_network.h"
+
 #ifndef PREG_OFFSET_CAPTURE
 # define PREG_OFFSET_CAPTURE                 (1<<8)
 #endif
@@ -218,7 +221,7 @@ file_buffer(struct magic_set *ms, php_stream *stream, const char *inname, const
 
        /* Check if we have a CDF file */
        if ((ms->flags & MAGIC_NO_CHECK_CDF) == 0) {
-               int fd;
+               php_socket_t fd;
                TSRMLS_FETCH();
                if (stream && SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD, (void **)&fd, 0)) {
                        if ((m = file_trycdf(ms, fd, ubuf, nb)) != 0) {
index f4c3b4738c6be729d01a6146a2ceceb6364d8b82..50ceb605ed6560f630596736f1cfd3cba7371059 100644 (file)
@@ -34,6 +34,7 @@
 #include "exec.h"
 #include "php_globals.h"
 #include "SAPI.h"
+#include "main/php_network.h"
 
 #ifdef NETWARE
 #include <proc.h>
@@ -556,7 +557,7 @@ PHP_FUNCTION(proc_open)
                if (Z_TYPE_PP(descitem) == IS_RESOURCE) {
                        /* should be a stream - try and dup the descriptor */
                        php_stream *stream;
-                       int fd;
+                       php_socket_t fd;
 
                        php_stream_from_zval(stream, descitem);
 
@@ -629,7 +630,7 @@ PHP_FUNCTION(proc_open)
 
                        } else if (strcmp(Z_STRVAL_PP(ztype), "file") == 0) {
                                zval **zfile, **zmode;
-                               int fd;
+                               php_socket_t fd;
                                php_stream *stream;
 
                                descriptors[ndesc].mode = DESC_FILE;
index b62344765160f9189284de4d01643d6b129ae9cd..e19a453fd8e7c07324640947c3823e6a74d9f504 100644 (file)
@@ -613,7 +613,7 @@ static int stream_array_to_fd_set(zval *stream_array, fd_set *fds, php_socket_t
                /* 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_socket_t this_fd;
 
                php_stream_from_zval_no_verify(stream, elem);
                if (stream == NULL) {
@@ -624,9 +624,7 @@ 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*)&tmp_fd, 1) && tmp_fd != -1) {
-
-                       php_socket_t this_fd = (php_socket_t)tmp_fd;
+               if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&this_fd, 1) && this_fd != -1) {
 
                        PHP_SAFE_FD_SET(this_fd, fds);
 
@@ -660,10 +658,7 @@ 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;
+               php_socket_t this_fd;
 
 
                type = zend_hash_get_current_key_ex(Z_ARRVAL_P(stream_array),
@@ -682,10 +677,7 @@ 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*)&tmp_fd, 1) && tmp_fd != -1) {
-
-                       php_socket_t this_fd = (php_socket_t)tmp_fd;
-
+               if (SUCCESS == php_stream_cast(stream, PHP_STREAM_AS_FD_FOR_SELECT | PHP_STREAM_CAST_INTERNAL, (void*)&this_fd, 1) && this_fd != SOCK_ERR) {
                        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);
index d381f5f5da5756469439bcd10719c1e28952bf66..be0ebd4382c274ab8fca5716507bd67b7473025a 100644 (file)
@@ -25,6 +25,8 @@
 #include "php_zlib.h"
 #include "fopen_wrappers.h"
 
+#include "main/php_network.h"
+
 struct php_gz_stream_data_t    {
        gzFile gz_file;
        php_stream *stream;
@@ -129,7 +131,7 @@ php_stream *php_stream_gzopen(php_stream_wrapper *wrapper, const char *path, con
        innerstream = php_stream_open_wrapper_ex(path, mode, STREAM_MUST_SEEK | options | STREAM_WILL_CAST, opened_path, context);
        
        if (innerstream) {
-               int fd;
+               php_socket_t fd;
 
                if (SUCCESS == php_stream_cast(innerstream, PHP_STREAM_AS_FD, (void **) &fd, REPORT_ERRORS)) {
                        self = emalloc(sizeof(*self));
index 6ddfc74a110fdf3a78b165e6ecc57f5e37c4bbba..5e9e5c7acea7a8353f70ebd6c65f67441072d96d 100644 (file)
@@ -482,7 +482,7 @@ static int php_stdiop_seek(php_stream *stream, off_t offset, int whence, off_t *
 
 static int php_stdiop_cast(php_stream *stream, int castas, void **ret TSRMLS_DC)
 {
-       int fd;
+       php_socket_t fd;
        php_stdio_stream_data *data = (php_stdio_stream_data*) stream->abstract;
 
        assert(data != NULL);
@@ -506,31 +506,31 @@ static int php_stdiop_cast(php_stream *stream, int castas, void **ret TSRMLS_DC)
                                }
                                
                                *(FILE**)ret = data->file;
-                               data->fd = -1;
+                               data->fd = SOCK_ERR;
                        }
                        return SUCCESS;
 
                case PHP_STREAM_AS_FD_FOR_SELECT:
                        PHP_STDIOP_GET_FD(fd, data);
-                       if (fd < 0) {
+                       if (SOCK_ERR == fd) {
                                return FAILURE;
                        }
                        if (ret) {
-                               *(int*)ret = fd;
+                               *(php_socket_t *)ret = fd;
                        }
                        return SUCCESS;
 
                case PHP_STREAM_AS_FD:
                        PHP_STDIOP_GET_FD(fd, data);
 
-                       if (fd < 0) {
+                       if (SOCK_ERR == fd) {
                                return FAILURE;
                        }
                        if (data->file) {
                                fflush(data->file);
                        }
                        if (ret) {
-                               *(int*)ret = fd;
+                               *(php_socket_t *)ret = fd;
                        }
                        return SUCCESS;
                default: