From de1d8909c3eb66a5326ee93908dc55899aa862cb Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Wed, 18 May 2022 10:32:02 +0800 Subject: [PATCH] fix: hexstr2bin support half byte --- CHANGES-4.3.md | 1 + .../test/emqx_rule_funcs_SUITE.erl | 8 ++++++-- src/emqx.appup.src | 14 +++++++++----- src/emqx_misc.erl | 14 +++++++++++++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/CHANGES-4.3.md b/CHANGES-4.3.md index 8b509fe17..566022ddf 100644 --- a/CHANGES-4.3.md +++ b/CHANGES-4.3.md @@ -27,6 +27,7 @@ File format: * List subscription topic (/api/v4/subscriptions), the result do not match with multiple conditions. * SSL closed error bug fixed for redis client. * Fix mqtt-sn client disconnected due to re-send a duplicated qos2 message +* rule-engine function hexstr2bin/1 support half byte * Improved resilience against autocluster partitioning during cluster startup. [#7876] 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 cf07da20f..116c99f29 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -159,8 +159,12 @@ t_term_encode(_) -> end, TestData). t_hexstr2bin(_) -> - ?assertEqual(<<1,2>>, emqx_rule_funcs:hexstr2bin(<<"0102">>)), - ?assertEqual(<<17,33>>, emqx_rule_funcs:hexstr2bin(<<"1121">>)). + ?assertEqual(<<6, 54, 79>>, emqx_rule_funcs:hexstr2bin(<<"6364f">>)), + ?assertEqual(<<10>>, emqx_rule_funcs:hexstr2bin(<<"a">>)), + ?assertEqual(<<15>>, emqx_rule_funcs:hexstr2bin(<<"f">>)), + ?assertEqual(<<5>>, emqx_rule_funcs:hexstr2bin(<<"5">>)), + ?assertEqual(<<1, 2>>, emqx_rule_funcs:hexstr2bin(<<"0102">>)), + ?assertEqual(<<17, 33>>, emqx_rule_funcs:hexstr2bin(<<"1121">>)). t_bin2hexstr(_) -> ?assertEqual(<<"0102">>, emqx_rule_funcs:bin2hexstr(<<1,2>>)), diff --git a/src/emqx.appup.src b/src/emqx.appup.src index be7c60261..ea2c006bc 100644 --- a/src/emqx.appup.src +++ b/src/emqx.appup.src @@ -2,13 +2,15 @@ %% Unless you know what you are doing, DO NOT edit manually!! {VSN, [{"4.3.15", - [{load_module,emqx_frame,brutal_purge,soft_purge,[]}, + [{load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_frame,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.14", - [{load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, - {load_module,emqx_channel,brutal_purge,soft_purge,[]}, + [{load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, + {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, {load_module,emqx_plugins,brutal_purge,soft_purge,[]}, @@ -459,12 +461,14 @@ {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]}, {<<".*">>,[]}], [{"4.3.15", - [{load_module,emqx_frame,brutal_purge,soft_purge,[]}, + [{load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_frame,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, {load_module,emqx_app,brutal_purge,soft_purge,[]}]}, {"4.3.14", - [{load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, + [{load_module,emqx_misc,brutal_purge,soft_purge,[]}, + {load_module,emqx_access_rule,brutal_purge,soft_purge,[]}, {load_module,emqx,brutal_purge,soft_purge,[]}, {load_module,emqx_channel,brutal_purge,soft_purge,[]}, {load_module,emqx_sys,brutal_purge,soft_purge,[]}, diff --git a/src/emqx_misc.erl b/src/emqx_misc.erl index cc0d7d247..36a3386e3 100644 --- a/src/emqx_misc.erl +++ b/src/emqx_misc.erl @@ -317,7 +317,19 @@ int2hexchar(I, lower) -> I - 10 + $a. -spec(hexstr2bin(binary()) -> binary()). hexstr2bin(B) when is_binary(B) -> - << <<(hexchar2int(H)*16 + hexchar2int(L))>> || <> <= B>>. + hexstr2bin(B, erlang:bit_size(B)). + +hexstr2bin(B, Size) when is_binary(B) -> + case Size rem 16 of + 0 -> + make_binary(B); + 8 -> + make_binary(<<"0", B/binary>>); + _ -> + throw({unsupport_hex_string, B, Size}) + end. + +make_binary(B) -> <<<<(hexchar2int(H) * 16 + hexchar2int(L))>> || <> <= B>>. hexchar2int(I) when I >= $0 andalso I =< $9 -> I - $0; hexchar2int(I) when I >= $A andalso I =< $F -> I - $A + 10;