]> granicus.if.org Git - php/commitdiff
Fixed bug #65486 mysqli_poll() is broken on Win x64
authorAnatol Belski <ab@php.net>
Thu, 12 Dec 2013 09:17:01 +0000 (10:17 +0100)
committerAnatol Belski <ab@php.net>
Thu, 12 Dec 2013 09:17:01 +0000 (10:17 +0100)
While this issue is visible in mysqli_poll() functions, the cause
lays deeper in the stream to socket casting API. On Win x64 the
SOCKET datatype is a 64 or 32 bit unsigned, while on Linux/Unix-like
it's 32 bit signed integer. The game of casting 32 bit var to/from
64 bit pointer back and forth is the best way to break it.

Further more, while socket and file descriptors are always integers
on Linux, those are different things using different APIs on Windows.
Even though using integer instead of SOCKET might work on Windows, this
issue might need to be revamped more carefully later. By this time
this patch is tested well with phpt and apps and shows no regressions,
neither in mysqli_poll() nor in any other parts.

NEWS
ext/openssl/xp_ssl.c
main/streams/xp_socket.c

diff --git a/NEWS b/NEWS
index 40a8515e9d6ac8d2c3d35a72bdc1b88aa81b1791..12132d16b47a9abaf434f89cb81a994444f4e6f5 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,9 @@ PHP                                                                        NEWS
   . Fixed bug #64405 (Use freetype-config for determining freetype2 dir(s)).
     (Adam)
 
+- MySQLi:
+  . Fixed bug #65486 (mysqli_poll() is broken on win x64). (Anatol)
+
 - SOAP
   . Fixed bug #66112 (Use after free condition in SOAP extension).
     (martin dot koegler at brz dot gv dot at)
index a1a7ffc3f4bdcb3121e13d816f1f5d6c6f8ce406..1d1c91f132ff88a48e7237cf5d9cb69f529c3ef0 100644 (file)
@@ -825,7 +825,7 @@ static int php_openssl_sockop_cast(php_stream *stream, int castas, void **ret TS
 
                case PHP_STREAM_AS_FD_FOR_SELECT:
                        if (ret) {
-                               *(int *)ret = sslsock->s.socket;
+                               *(php_socket_t *)ret = sslsock->s.socket;
                        }
                        return SUCCESS;
 
@@ -835,7 +835,7 @@ static int php_openssl_sockop_cast(php_stream *stream, int castas, void **ret TS
                                return FAILURE;
                        }
                        if (ret) {
-                               *(int *)ret = sslsock->s.socket;
+                               *(php_socket_t *)ret = sslsock->s.socket;
                        }
                        return SUCCESS;
                default:
index a9c050f2672d2873e3b8d1a9b16bdb46216c4430..34a106e280d4bb42b1a274fd57d1c818d45f3f66 100644 (file)
@@ -426,7 +426,7 @@ static int php_sockop_cast(php_stream *stream, int castas, void **ret TSRMLS_DC)
                case PHP_STREAM_AS_FD:
                case PHP_STREAM_AS_SOCKETD:
                        if (ret)
-                               *(int*)ret = sock->socket;
+                               *(php_socket_t *)ret = sock->socket;
                        return SUCCESS;
                default:
                        return FAILURE;