summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2013-12-12 10:17:01 +0100
committerAnatol Belski <ab@php.net>2013-12-12 10:17:01 +0100
commitda62fd5ed824bafc4dc3e90278c3d57d8e74cbe1 (patch)
tree6cfb2dfa7cb45c0a25975743dcb46ed1c7fbc41f
parentd7a45a67be2b82272a908cff54cc4d78a3c6e206 (diff)
downloadphp-git-da62fd5ed824bafc4dc3e90278c3d57d8e74cbe1.tar.gz
Fixed bug #65486 mysqli_poll() is broken on Win x64
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.
-rw-r--r--NEWS3
-rw-r--r--ext/openssl/xp_ssl.c4
-rw-r--r--main/streams/xp_socket.c2
3 files changed, 6 insertions, 3 deletions
diff --git a/NEWS b/NEWS
index 40a8515e9d..12132d16b4 100644
--- 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)
diff --git a/ext/openssl/xp_ssl.c b/ext/openssl/xp_ssl.c
index a1a7ffc3f4..1d1c91f132 100644
--- a/ext/openssl/xp_ssl.c
+++ b/ext/openssl/xp_ssl.c
@@ -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:
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index a9c050f267..34a106e280 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -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;