diff options
author | Anatol Belski <ab@php.net> | 2013-05-08 18:58:32 +0200 |
---|---|---|
committer | Anatol Belski <ab@php.net> | 2013-05-08 19:22:37 +0200 |
commit | 4091e946606deaf2f8d909e20701bdb832996074 (patch) | |
tree | 00b5c6fa7dc7f837953f11692d3080b51f228561 /ext/mbstring | |
parent | 288f04c430b271c416b4cc0a4cef7845927be7b0 (diff) | |
download | php-git-4091e946606deaf2f8d909e20701bdb832996074.tar.gz |
Fixed bug #64769 mbstring PHPTs crash on Windows x64
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
Diffstat (limited to 'ext/mbstring')
-rw-r--r-- | ext/mbstring/oniguruma/oniguruma.h | 7 | ||||
-rw-r--r-- | ext/mbstring/oniguruma/st.h | 5 |
2 files changed, 11 insertions, 1 deletions
diff --git a/ext/mbstring/oniguruma/oniguruma.h b/ext/mbstring/oniguruma/oniguruma.h index 3b557639f1..bf00e20f63 100644 --- a/ext/mbstring/oniguruma/oniguruma.h +++ b/ext/mbstring/oniguruma/oniguruma.h @@ -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; diff --git a/ext/mbstring/oniguruma/st.h b/ext/mbstring/oniguruma/st.h index da65e7fef8..6f93870214 100644 --- a/ext/mbstring/oniguruma/st.h +++ b/ext/mbstring/oniguruma/st.h @@ -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; |