diff --git a/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c b/ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c index 9b28556dee6..141a2fee7c5 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 b38e4088064..a6a4e9f01fb 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/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c index d8049617014..be861629d0e 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c +++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c @@ -114,22 +114,8 @@ #endif -static const char *mbfl_encoding_auto_aliases[] = {"unknown", NULL}; - -static const mbfl_encoding mbfl_encoding_auto = { - mbfl_no_encoding_auto, - "auto", - NULL, - (const char *(*)[])&mbfl_encoding_auto_aliases, - NULL, - 0, - NULL, - NULL -}; - static const mbfl_encoding *mbfl_encoding_ptr_list[] = { &mbfl_encoding_pass, - &mbfl_encoding_auto, &mbfl_encoding_wchar, &mbfl_encoding_byte2be, &mbfl_encoding_byte2le, diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h index 2952977fd88..c3a9c0affc7 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h +++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.h @@ -36,7 +36,6 @@ enum mbfl_no_encoding { mbfl_no_encoding_invalid = -1, mbfl_no_encoding_pass, - mbfl_no_encoding_auto, mbfl_no_encoding_wchar, mbfl_no_encoding_byte2be, mbfl_no_encoding_byte2le, diff --git a/ext/mbstring/tests/bug77025.phpt b/ext/mbstring/tests/bug77025.phpt new file mode 100644 index 00000000000..46416c1df18 --- /dev/null +++ b/ext/mbstring/tests/bug77025.phpt @@ -0,0 +1,12 @@ +--TEST-- +Bug #77025: mb_strpos throws Unknown encoding or conversion error +--FILE-- + +--EXPECT-- +int(1) +int(1) diff --git a/ext/mbstring/tests/mb_preferred_mime_name.phpt b/ext/mbstring/tests/mb_preferred_mime_name.phpt index 1fa73421f69..df05027c3c6 100644 --- a/ext/mbstring/tests/mb_preferred_mime_name.phpt +++ b/ext/mbstring/tests/mb_preferred_mime_name.phpt @@ -38,7 +38,7 @@ echo "== INVALID PARAMETER ==\n"; var_dump(mb_preferred_mime_name('BAD_NAME')); // No preferred name -var_dump(mb_preferred_mime_name('auto')); +var_dump(mb_preferred_mime_name('pass')); ?> --EXPECTF-- Shift_JIS @@ -55,5 +55,5 @@ UCS-4 Warning: mb_preferred_mime_name(): Unknown encoding "BAD_NAME" in %s on line %d bool(false) -Warning: mb_preferred_mime_name(): No MIME preferred name corresponding to "auto" in %s on line %d +Warning: mb_preferred_mime_name(): No MIME preferred name corresponding to "pass" in %s on line %d bool(false)