summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c4
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter_8bit.c45
-rw-r--r--ext/mbstring/tests/bug77025.phpt12
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)