Skip to content

Commit

Permalink
Fix GH-10648: add check function pointer into mbfl_encoding
Browse files Browse the repository at this point in the history
Previously, mbstring used the same logic for encoding validation as for
encoding conversion.

However, there are cases where we want to use different logic for validation
and conversion. For example, if a string ends up with missing input
required by the encoding, or if a character is input that is invalid
as an encoding but can be converted, the conversion should succeed and
the validation should fail.

To achieve this, a function pointer mb_check_fn has been added to
struct mbfl_encoding to implement the logic used for validation.
Also, added implementation of validation logic for UTF-7, UTF7-IMAP,
ISO-2022-JP and JIS.
  • Loading branch information
pakutoma authored and alexdowad committed Mar 24, 2023
1 parent a082696 commit 6fc8d01
Show file tree
Hide file tree
Showing 48 changed files with 1,745 additions and 114 deletions.
10 changes: 10 additions & 0 deletions UPGRADING
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,16 @@ PHP 8.2 UPGRADE NOTES
dba_fetch(string|array $key, $skip, $dba): string|false
is still accepted, but it is recommended to use the new standard variant.

- MBString
. mb_check_encoding() now checks input encoding more strictly.
. mb_detect_encoding() now checks input encoding more strictly
when strict detection is enabled.
. mb_convert_encoding() checks the input encoding more strictly
if multiple encodings are passed to from_encoding
and the mbstring.strict_detection INI directive is set to 1.
This change only affects the encoding selection,
not the result of the conversion.

- Random
. random_bytes() and random_int() now throw \Random\RandomException on CSPRNG failure.
Previously a plain \Exception was thrown.
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_7bit.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ const mbfl_encoding mbfl_encoding_7bit = {
&vtbl_7bit_wchar,
&vtbl_wchar_7bit,
mb_7bit_to_wchar,
mb_wchar_to_7bit
mb_wchar_to_7bit,
NULL
};

#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_base64.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ const mbfl_encoding mbfl_encoding_base64 = {
NULL,
NULL,
mb_base64_to_wchar,
mb_wchar_to_base64
mb_wchar_to_base64,
NULL
};

const struct mbfl_convert_vtbl vtbl_8bit_b64 = {
Expand Down
6 changes: 4 additions & 2 deletions ext/mbstring/libmbfl/filters/mbfilter_big5.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ const mbfl_encoding mbfl_encoding_big5 = {
&vtbl_big5_wchar,
&vtbl_wchar_big5,
mb_big5_to_wchar,
mb_wchar_to_big5
mb_wchar_to_big5,
NULL
};

const mbfl_encoding mbfl_encoding_cp950 = {
Expand All @@ -82,7 +83,8 @@ const mbfl_encoding mbfl_encoding_cp950 = {
&vtbl_cp950_wchar,
&vtbl_wchar_cp950,
mb_cp950_to_wchar,
mb_wchar_to_cp950
mb_wchar_to_cp950,
NULL
};

const struct mbfl_convert_vtbl vtbl_big5_wchar = {
Expand Down
9 changes: 6 additions & 3 deletions ext/mbstring/libmbfl/filters/mbfilter_cp5022x.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ const mbfl_encoding mbfl_encoding_cp50220 = {
&vtbl_cp50220_wchar,
&vtbl_wchar_cp50220,
mb_cp5022x_to_wchar,
mb_wchar_to_cp50220
mb_wchar_to_cp50220,
NULL
};

const mbfl_encoding mbfl_encoding_cp50221 = {
Expand All @@ -74,7 +75,8 @@ const mbfl_encoding mbfl_encoding_cp50221 = {
&vtbl_cp50221_wchar,
&vtbl_wchar_cp50221,
mb_cp5022x_to_wchar,
mb_wchar_to_cp50221
mb_wchar_to_cp50221,
NULL
};

const mbfl_encoding mbfl_encoding_cp50222 = {
Expand All @@ -87,7 +89,8 @@ const mbfl_encoding mbfl_encoding_cp50222 = {
&vtbl_cp50222_wchar,
&vtbl_wchar_cp50222,
mb_cp5022x_to_wchar,
mb_wchar_to_cp50222
mb_wchar_to_cp50222,
NULL
};

const struct mbfl_convert_vtbl vtbl_cp50220_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_cp51932.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ const mbfl_encoding mbfl_encoding_cp51932 = {
&vtbl_cp51932_wchar,
&vtbl_wchar_cp51932,
mb_cp51932_to_wchar,
mb_wchar_to_cp51932
mb_wchar_to_cp51932,
NULL
};

const struct mbfl_convert_vtbl vtbl_cp51932_wchar = {
Expand Down
6 changes: 4 additions & 2 deletions ext/mbstring/libmbfl/filters/mbfilter_cp932.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ const mbfl_encoding mbfl_encoding_cp932 = {
&vtbl_cp932_wchar,
&vtbl_wchar_cp932,
mb_cp932_to_wchar,
mb_wchar_to_cp932
mb_wchar_to_cp932,
NULL
};

const struct mbfl_convert_vtbl vtbl_cp932_wchar = {
Expand Down Expand Up @@ -133,7 +134,8 @@ const mbfl_encoding mbfl_encoding_sjiswin = {
&vtbl_sjiswin_wchar,
&vtbl_wchar_sjiswin,
mb_cp932_to_wchar,
mb_wchar_to_sjiswin
mb_wchar_to_sjiswin,
NULL
};

const struct mbfl_convert_vtbl vtbl_sjiswin_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_cp936.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ const mbfl_encoding mbfl_encoding_cp936 = {
&vtbl_cp936_wchar,
&vtbl_wchar_cp936,
mb_cp936_to_wchar,
mb_wchar_to_cp936
mb_wchar_to_cp936,
NULL
};

const struct mbfl_convert_vtbl vtbl_cp936_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_euc_cn.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ const mbfl_encoding mbfl_encoding_euc_cn = {
&vtbl_euccn_wchar,
&vtbl_wchar_euccn,
mb_euccn_to_wchar,
mb_wchar_to_euccn
mb_wchar_to_euccn,
NULL
};

const struct mbfl_convert_vtbl vtbl_euccn_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_euc_jp.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ const mbfl_encoding mbfl_encoding_euc_jp = {
&vtbl_eucjp_wchar,
&vtbl_wchar_eucjp,
mb_eucjp_to_wchar,
mb_wchar_to_eucjp
mb_wchar_to_eucjp,
NULL
};

const struct mbfl_convert_vtbl vtbl_eucjp_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_euc_jp_win.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ const mbfl_encoding mbfl_encoding_eucjp_win = {
&vtbl_eucjpwin_wchar,
&vtbl_wchar_eucjpwin,
mb_eucjpwin_to_wchar,
mb_wchar_to_eucjpwin
mb_wchar_to_eucjpwin,
NULL
};

const struct mbfl_convert_vtbl vtbl_eucjpwin_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_euc_kr.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ const mbfl_encoding mbfl_encoding_euc_kr = {
&vtbl_euckr_wchar,
&vtbl_wchar_euckr,
mb_euckr_to_wchar,
mb_wchar_to_euckr
mb_wchar_to_euckr,
NULL
};

const struct mbfl_convert_vtbl vtbl_euckr_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_euc_tw.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ const mbfl_encoding mbfl_encoding_euc_tw = {
&vtbl_euctw_wchar,
&vtbl_wchar_euctw,
mb_euctw_to_wchar,
mb_wchar_to_euctw
mb_wchar_to_euctw,
NULL
};

const struct mbfl_convert_vtbl vtbl_euctw_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_gb18030.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ const mbfl_encoding mbfl_encoding_gb18030 = {
&vtbl_gb18030_wchar,
&vtbl_wchar_gb18030,
mb_gb18030_to_wchar,
mb_wchar_to_gb18030
mb_wchar_to_gb18030,
NULL
};

const struct mbfl_convert_vtbl vtbl_gb18030_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_htmlent.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ const mbfl_encoding mbfl_encoding_html_ent = {
&vtbl_html_wchar,
&vtbl_wchar_html,
mb_htmlent_to_wchar,
mb_wchar_to_htmlent
mb_wchar_to_htmlent,
NULL
};

const struct mbfl_convert_vtbl vtbl_wchar_html = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_hz.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ const mbfl_encoding mbfl_encoding_hz = {
&vtbl_hz_wchar,
&vtbl_wchar_hz,
mb_hz_to_wchar,
mb_wchar_to_hz
mb_wchar_to_hz,
NULL
};

const struct mbfl_convert_vtbl vtbl_hz_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_iso2022_jp_ms.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ const mbfl_encoding mbfl_encoding_2022jpms = {
&vtbl_2022jpms_wchar,
&vtbl_wchar_2022jpms,
mb_iso2022jpms_to_wchar,
mb_wchar_to_iso2022jpms
mb_wchar_to_iso2022jpms,
NULL
};

const struct mbfl_convert_vtbl vtbl_2022jpms_wchar = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ const mbfl_encoding mbfl_encoding_2022kr = {
&vtbl_2022kr_wchar,
&vtbl_wchar_2022kr,
mb_iso2022kr_to_wchar,
mb_wchar_to_iso2022kr
mb_wchar_to_iso2022kr,
NULL
};

const struct mbfl_convert_vtbl vtbl_wchar_2022kr = {
Expand Down
3 changes: 2 additions & 1 deletion ext/mbstring/libmbfl/filters/mbfilter_iso2022jp_mobile.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,8 @@ const mbfl_encoding mbfl_encoding_2022jp_kddi = {
&vtbl_2022jp_kddi_wchar,
&vtbl_wchar_2022jp_kddi,
mb_iso2022jp_kddi_to_wchar,
mb_wchar_to_iso2022jp_kddi
mb_wchar_to_iso2022jp_kddi,
NULL
};

const struct mbfl_convert_vtbl vtbl_2022jp_kddi_wchar = {
Expand Down
Loading

0 comments on commit 6fc8d01

Please sign in to comment.