From 916168c755876648bf9b5faa275b891a57a104de Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Wed, 8 May 2024 15:09:54 +0200 Subject: [PATCH] fix: make rule engine unescape convert \a to the terminal alarm char The rule engine unescape function should convert the escape sequence \a to the alarm bell symbol (ASCII 7). This bug was created as it was assumed that Erlang convert $\a to 7 but Erlang does not handle the \a escape sequence and instead convert it to 97 (ASCII code for a). Fixes: https://emqx.atlassian.net/browse/EMQX-12313 --- .../test/emqx_rule_funcs_SUITE.erl | 22 +++++++++---------- apps/emqx_utils/src/emqx_variform_bif.erl | 3 ++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 537facd80..e260b04e1 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -744,18 +744,18 @@ t_regex_replace(_) -> ?assertEqual(<<"a[cc]b[c]d">>, apply_func(regex_replace, [<<"accbcd">>, <<"c+">>, <<"[&]">>])). t_unescape(_) -> - ?assertEqual(<<"\n">>, emqx_rule_funcs:unescape(<<"\\n">>)), - ?assertEqual(<<"\t">>, emqx_rule_funcs:unescape(<<"\\t">>)), - ?assertEqual(<<"\r">>, emqx_rule_funcs:unescape(<<"\\r">>)), - ?assertEqual(<<"\b">>, emqx_rule_funcs:unescape(<<"\\b">>)), - ?assertEqual(<<"\f">>, emqx_rule_funcs:unescape(<<"\\f">>)), - ?assertEqual(<<"\v">>, emqx_rule_funcs:unescape(<<"\\v">>)), - ?assertEqual(<<"'">>, emqx_rule_funcs:unescape(<<"\\'">>)), - ?assertEqual(<<"\"">>, emqx_rule_funcs:unescape(<<"\\\"">>)), - ?assertEqual(<<"?">>, emqx_rule_funcs:unescape(<<"\\?">>)), - ?assertEqual(<<"\a">>, emqx_rule_funcs:unescape(<<"\\a">>)), + ?assertEqual(<<"\n">> = <<10>>, emqx_rule_funcs:unescape(<<"\\n">>)), + ?assertEqual(<<"\t">> = <<9>>, emqx_rule_funcs:unescape(<<"\\t">>)), + ?assertEqual(<<"\r">> = <<13>>, emqx_rule_funcs:unescape(<<"\\r">>)), + ?assertEqual(<<"\b">> = <<8>>, emqx_rule_funcs:unescape(<<"\\b">>)), + ?assertEqual(<<"\f">> = <<12>>, emqx_rule_funcs:unescape(<<"\\f">>)), + ?assertEqual(<<"\v">> = <<11>>, emqx_rule_funcs:unescape(<<"\\v">>)), + ?assertEqual(<<"'">> = <<39>>, emqx_rule_funcs:unescape(<<"\\'">>)), + ?assertEqual(<<"\"">> = <<34>>, emqx_rule_funcs:unescape(<<"\\\"">>)), + ?assertEqual(<<"?">> = <<63>>, emqx_rule_funcs:unescape(<<"\\?">>)), + ?assertEqual(<<7>>, emqx_rule_funcs:unescape(<<"\\a">>)), % Test escaping backslash itself - ?assertEqual(<<"\\">>, emqx_rule_funcs:unescape(<<"\\\\">>)), + ?assertEqual(<<"\\">> = <<92>>, emqx_rule_funcs:unescape(<<"\\\\">>)), % Test a string without any escape sequences ?assertEqual(<<"Hello, World!">>, emqx_rule_funcs:unescape(<<"Hello, World!">>)), % Test a string with escape sequences diff --git a/apps/emqx_utils/src/emqx_variform_bif.erl b/apps/emqx_utils/src/emqx_variform_bif.erl index 91bd4f9cf..ed9dfb851 100644 --- a/apps/emqx_utils/src/emqx_variform_bif.erl +++ b/apps/emqx_utils/src/emqx_variform_bif.erl @@ -289,7 +289,8 @@ unescape_string([$\\, $" | Rest], Acc) -> unescape_string([$\\, $? | Rest], Acc) -> unescape_string(Rest, [$\? | Acc]); unescape_string([$\\, $a | Rest], Acc) -> - unescape_string(Rest, [$\a | Acc]); + %% Terminal bell + unescape_string(Rest, [7 | Acc]); %% Start of HEX escape code unescape_string([$\\, $x | [$0 | _] = HexStringStart], Acc) -> unescape_handle_hex_string(HexStringStart, Acc);