From e26234a0447ff14af6b2fe4432662eb565138b3f Mon Sep 17 00:00:00 2001 From: Alex Dowad Date: Wed, 14 Oct 2020 13:01:25 +0200 Subject: [PATCH] UTF-32 conversion treats truncated characters as illegal --- ext/mbstring/libmbfl/filters/mbfilter_utf32.c | 22 ++++++++++++++++--- 1 file 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 -- 2.40.0