diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c | 45 | ||||
-rw-r--r-- | ext/mbstring/tests/bug77025.phpt | 12 |
3 files changed, 59 insertions, 2 deletions
@@ -11,6 +11,10 @@ PHP NEWS . Fixed bug #77007 (fractions in `diff()` are not correctly normalized). (Derick) +- Mbstring: + . Fixed bug #77025 (mb_strpos throws Unknown encoding or conversion error). + (Nikita) + - Tokenizer: . Fixed bug #76991 (Incorrect tokenization of multiple invalid flexible heredoc strings). (Nikita) diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c index 4faa9b8b1b..6b5b009535 100644 --- a/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c +++ b/ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c @@ -38,6 +38,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 = { @@ -47,6 +52,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) |