diff options
author | Alex Dowad <alexinbeijing@gmail.com> | 2020-10-14 13:01:25 +0200 |
---|---|---|
committer | Alex Dowad <alexinbeijing@gmail.com> | 2020-10-27 10:19:01 +0200 |
commit | e26234a0447ff14af6b2fe4432662eb565138b3f (patch) | |
tree | 9c7239c6f219df57631ac7a73b5ac4899ab1381a /ext/mbstring | |
parent | 7047e5d2c409c073799139490b92ffde2e6b1afb (diff) | |
download | php-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.c | 22 |
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 |