summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2023-04-24 07:57:09 +0200
committerBjörn Gustavsson <bjorn@erlang.org>2023-04-24 08:13:00 +0200
commit7bdc674af93547be6bb41dededdc2f11b3ef19dd (patch)
treeb55a051a757cbcd95c857c68561e9aab77a2ef10
parent5400ccf243a31d664153a4b9ceb9de3edfce1e0e (diff)
downloaderlang-7bdc674af93547be6bb41dededdc2f11b3ef19dd.tar.gz
Eliminate crash in matching of utf32 segment
-rw-r--r--erts/emulator/beam/emu/ops.tab5
-rw-r--r--erts/emulator/beam/jit/arm/ops.tab4
-rw-r--r--erts/emulator/beam/jit/x86/ops.tab5
-rw-r--r--erts/emulator/test/bs_utf_SUITE.erl4
4 files changed, 18 insertions, 0 deletions
diff --git a/erts/emulator/beam/emu/ops.tab b/erts/emulator/beam/emu/ops.tab
index 814fd23b1b..fed0ef4293 100644
--- a/erts/emulator/beam/emu/ops.tab
+++ b/erts/emulator/beam/emu/ops.tab
@@ -1233,6 +1233,11 @@ bs_skip_utf16 Fail=f Ms=xy Unit=u Flags=u => bs_get_utf16 Fail Ms Unit Flags x
i_bs_get_utf16 xy f? t d
+bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst | equal(Ms, Dst) =>
+ bs_get_integer2 Fail Ms Live i=32 u=1 Flags x |
+ i_bs_validate_unicode_retract Fail x Ms |
+ move x Dst
+
bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst=d =>
bs_get_integer2 Fail Ms Live i=32 u=1 Flags Dst |
i_bs_validate_unicode_retract Fail Dst Ms
diff --git a/erts/emulator/beam/jit/arm/ops.tab b/erts/emulator/beam/jit/arm/ops.tab
index cc0bfeccf0..f9a0088824 100644
--- a/erts/emulator/beam/jit/arm/ops.tab
+++ b/erts/emulator/beam/jit/arm/ops.tab
@@ -951,6 +951,10 @@ bs_skip_utf16 Fail=f Ms=xy u Flags=u => skip_utf16(Fail, Ms, Flags)
i_bs_get_utf16 S f t d
i_bs_skip_utf16 S f t
+bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst | equal(Ms, Dst) =>
+ bs_get_integer2 Fail Ms Live i=32 u=1 Flags x |
+ i_bs_validate_unicode_retract Fail x Ms |
+ move x Dst
bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst=d =>
bs_get_integer2 Fail Ms Live i=32 u=1 Flags Dst |
i_bs_validate_unicode_retract Fail Dst Ms
diff --git a/erts/emulator/beam/jit/x86/ops.tab b/erts/emulator/beam/jit/x86/ops.tab
index 1ce0d6f9c2..c6db026e41 100644
--- a/erts/emulator/beam/jit/x86/ops.tab
+++ b/erts/emulator/beam/jit/x86/ops.tab
@@ -923,6 +923,11 @@ bs_skip_utf16 Fail=f Ms=xy u Flags=u => skip_utf16(Fail, Ms, Flags)
i_bs_get_utf16 S f t d
i_bs_skip_utf16 S f t
+bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst | equal(Ms, Dst) =>
+ bs_get_integer2 Fail Ms Live i=32 u=1 Flags x |
+ i_bs_validate_unicode_retract Fail x Ms |
+ move x Dst
+
bs_get_utf32 Fail=f Ms=xy Live=u Flags=u Dst=d =>
bs_get_integer2 Fail Ms Live i=32 u=1 Flags Dst |
i_bs_validate_unicode_retract Fail Dst Ms
diff --git a/erts/emulator/test/bs_utf_SUITE.erl b/erts/emulator/test/bs_utf_SUITE.erl
index a344f5c456..8885b31324 100644
--- a/erts/emulator/test/bs_utf_SUITE.erl
+++ b/erts/emulator/test/bs_utf_SUITE.erl
@@ -272,6 +272,10 @@ utf32_illegal_sequences(Config) when is_list(Config) ->
utf32_fail_range(16#10FFFF+1, 16#10FFFF+512), %Too large.
utf32_fail_range(16#D800, 16#DFFF), %Reserved for UTF-16.
utf32_fail_range(-100, -1),
+
+ <<>> = id(<< 0 || <<X/utf32>> <= <<"àxxx">>, _ = X >>),
+ <<>> = id(<< 0 || <<X/little-utf32>> <= <<"àxxx">>, _ = X >>),
+
ok.
utf32_fail_range(Char, End) when Char =< End ->