]> granicus.if.org Git - php/commitdiff
UTF-32 conversion treats truncated characters as illegal
authorAlex Dowad <alexinbeijing@gmail.com>
Wed, 14 Oct 2020 11:01:25 +0000 (13:01 +0200)
committerAlex Dowad <alexinbeijing@gmail.com>
Tue, 27 Oct 2020 08:19:01 +0000 (10:19 +0200)
ext/mbstring/libmbfl/filters/mbfilter_utf32.c

index ddd942d6e9c754a558ddfc47b1fa4906202f9a2f..1d9f4795958008a8b8d7bf053a0b71fcb47b4cb9 100644 (file)
@@ -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