diff options
-rw-r--r-- | ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c | 4 | ||||
-rw-r--r-- | ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c | 45 | ||||
-rw-r--r-- | ext/mbstring/tests/bug77025.phpt | 12 |
3 files changed, 58 insertions, 3 deletions
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c index 9b28556dee..141a2fee7c 100644 --- a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c +++ b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c @@ -66,7 +66,9 @@ const mbfl_encoding mbfl_encoding_euc_tw = { "EUC-TW", (const char *(*)[])&mbfl_encoding_euc_tw_aliases, mblen_table_euctw, - MBFL_ENCTYPE_MBCS + MBFL_ENCTYPE_MBCS, + &vtbl_euctw_wchar, + &vtbl_wchar_euctw }; const struct mbfl_identify_vtbl vtbl_identify_euctw = { diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c index b38e408806..a6a4e9f01f 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c @@ -36,6 +36,11 @@ #include "mbfilter.h" +const struct mbfl_convert_vtbl vtbl_8bit_wchar; +const struct mbfl_convert_vtbl vtbl_wchar_8bit; +static int mbfl_filt_conv_8bit_wchar(int c, mbfl_convert_filter *filter); +static int mbfl_filt_conv_wchar_8bit(int c, mbfl_convert_filter *filter); + static const char *mbfl_encoding_8bit_aliases[] = {"binary", NULL}; const mbfl_encoding mbfl_encoding_8bit = { @@ -45,6 +50,42 @@ const mbfl_encoding mbfl_encoding_8bit = { (const char *(*)[])&mbfl_encoding_8bit_aliases, NULL, MBFL_ENCTYPE_SBCS, - NULL, - NULL + &vtbl_8bit_wchar, + &vtbl_wchar_8bit +}; + +const struct mbfl_convert_vtbl vtbl_8bit_wchar = { + mbfl_no_encoding_8bit, + mbfl_no_encoding_wchar, + mbfl_filt_conv_common_ctor, + mbfl_filt_conv_common_dtor, + mbfl_filt_conv_8bit_wchar, + mbfl_filt_conv_common_flush +}; + +const struct mbfl_convert_vtbl vtbl_wchar_8bit = { + mbfl_no_encoding_wchar, + mbfl_no_encoding_8bit, + mbfl_filt_conv_common_ctor, + mbfl_filt_conv_common_dtor, + mbfl_filt_conv_wchar_8bit, + mbfl_filt_conv_common_flush }; + +#define CK(statement) do { if ((statement) < 0) return (-1); } while (0) + +static int mbfl_filt_conv_8bit_wchar(int c, mbfl_convert_filter *filter) +{ + return (*filter->output_function)(c, filter->data); +} + +static int mbfl_filt_conv_wchar_8bit(int c, mbfl_convert_filter *filter) +{ + if (c >= 0 && c < 0x100) { + CK((*filter->output_function)(c, filter->data)); + } else { + CK(mbfl_filt_conv_illegal_output(c, filter)); + } + + return c; +} diff --git a/ext/mbstring/tests/bug77025.phpt b/ext/mbstring/tests/bug77025.phpt new file mode 100644 index 0000000000..46416c1df1 --- /dev/null +++ b/ext/mbstring/tests/bug77025.phpt @@ -0,0 +1,12 @@ +--TEST-- +Bug #77025: mb_strpos throws Unknown encoding or conversion error +--FILE-- +<?php + +var_dump(mb_strpos('Hello', 'e', 0, '8bit')); +var_dump(mb_stripos('Hello', 'e', 0, '8bit')); + +?> +--EXPECT-- +int(1) +int(1) |