summaryrefslogtreecommitdiff
path: root/ext/mbstring
diff options
context:
space:
mode:
authorAlex Dowad <alexinbeijing@gmail.com>2020-10-14 13:01:25 +0200
committerAlex Dowad <alexinbeijing@gmail.com>2020-10-27 10:19:01 +0200
commite26234a0447ff14af6b2fe4432662eb565138b3f (patch)
tree9c7239c6f219df57631ac7a73b5ac4899ab1381a /ext/mbstring
parent7047e5d2c409c073799139490b92ffde2e6b1afb (diff)
downloadphp-git-e26234a0447ff14af6b2fe4432662eb565138b3f.tar.gz
UTF-32 conversion treats truncated characters as illegal
Diffstat (limited to 'ext/mbstring')
-rw-r--r--ext/mbstring/libmbfl/filters/mbfilter_utf32.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
index ddd942d6e9..1d9f479595 100644
--- a/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
+++ b/ext/mbstring/libmbfl/filters/mbfilter_utf32.c
@@ -33,6 +33,7 @@
static int mbfl_filt_ident_utf32(int c, mbfl_identify_filter *filter);
static int mbfl_filt_ident_utf32le(int c, mbfl_identify_filter *filter);
static int mbfl_filt_ident_utf32be(int c, mbfl_identify_filter *filter);
+static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter);
static const char *mbfl_encoding_utf32_aliases[] = {"utf32", NULL};
@@ -93,7 +94,7 @@ const struct mbfl_convert_vtbl vtbl_utf32_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -113,7 +114,7 @@ const struct mbfl_convert_vtbl vtbl_utf32be_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32be_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -133,7 +134,7 @@ const struct mbfl_convert_vtbl vtbl_utf32le_wchar = {
mbfl_filt_conv_common_ctor,
NULL,
mbfl_filt_conv_utf32le_wchar,
- mbfl_filt_conv_common_flush,
+ mbfl_filt_conv_utf32_wchar_flush,
NULL,
};
@@ -312,6 +313,21 @@ int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
return c;
}
+static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter)
+{
+ if (filter->status & 0xF) {
+ /* Input string was truncated */
+ CK((*filter->output_function)(filter->cache | MBFL_WCSGROUP_THROUGH, filter->data));
+ }
+
+ if (filter->flush_function) {
+ (*filter->flush_function)(filter->data);
+ }
+
+ filter->status = filter->cache = 0;
+ return 0;
+}
+
static int mbfl_filt_ident_utf32(int c, mbfl_identify_filter *filter)
{
/* The largest valid codepoint is 0x10FFFF; we don't want values above that