]> granicus.if.org Git - php/commitdiff
Fixed bug #64769 mbstring PHPTs crash on Windows x64
authorAnatol Belski <ab@php.net>
Wed, 8 May 2013 16:58:32 +0000 (18:58 +0200)
committerAnatol Belski <ab@php.net>
Wed, 8 May 2013 17:22:37 +0000 (19:22 +0200)
The tricky business going there in oniguruma is saving a pointer
in an int variable, passing that variable into a function and making
it a pointer again. On 64bit windows casting a pointer to a 32 bit
int will truncate that pointer. This kind of things won't work on
Windows x64.

[SNIPPET]
unsigned long ul0[2], ul1, *ul2;

ul0[0] = 42uL;
ul0[0] = 24uL;

ul1 = (unsigned long)ul0;
ul2 = (unsigned long *)ul1;

/* now it's broken, accessing ul2[0] will crash. */
[/SNIPPET]

To make it portable, ULONG_PTR should be used in this case.

In oniguruma this behaviour is to see at least in the following
codepath:

ext/mbstring/oniguruma/enc/unicode.c:10938
ext/mbstring/oniguruma/st.c:308
ext/mbstring/oniguruma/enc/unicode.c:10859

NEWS
ext/mbstring/oniguruma/oniguruma.h
ext/mbstring/oniguruma/st.h

diff --git a/NEWS b/NEWS
index 2a3b9179f2c12d63509841586cf11b3b5327297f..c0e4d7974aa6fab53b6f7c116c3531581216bbf4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,9 @@ PHP                                                                        NEWS
   . Fixed bug #64770 (stream_select() fails with pipes returned by proc_open()
     on Windows x64). (Anatol)
 
+- mbstring:
+  . Fixed bug #64769 (mbstring PHPTs crash on Windows x64). (Anatol)
+
 25 Apr 2013, PHP 5.5.0 Beta 4
 
 - Core:
index 3b557639f1daea2d1f440d171a1705ff9c442711..bf00e20f63b78b259a4763c5b5473ef44b9a2e16 100644 (file)
@@ -96,8 +96,13 @@ extern "C" {
 #define UChar OnigUChar
 #endif
 
-typedef unsigned char  OnigUChar;
+#ifdef _WIN32
+# include <windows.h>
+typedef ULONG_PTR OnigCodePoint;
+#else
 typedef unsigned long  OnigCodePoint;
+#endif
+typedef unsigned char  OnigUChar;
 typedef unsigned int   OnigCtype;
 typedef unsigned int   OnigDistance;
 
index da65e7fef83049c067e47ef10fad118f23693c03..6f93870214593820d70f5b20e0949378a18c4063 100644 (file)
@@ -6,7 +6,12 @@
 
 #define ST_INCLUDED
 
+#ifdef _WIN32
+# include <windows.h>
+typedef ULONG_PTR st_data_t;
+#else
 typedef unsigned long st_data_t;
+#endif
 #define ST_DATA_T_DEFINED
 
 typedef struct st_table st_table;