From 8ff9a03df3b93076d9c0b477569540cef241bc05 Mon Sep 17 00:00:00 2001 From: ieQu1 <99872536+ieQu1@users.noreply.github.com> Date: Thu, 9 Jun 2022 13:46:56 +0200 Subject: [PATCH 1/2] fix(retainer): Handle zero-length topic levels --- apps/emqx_retainer/src/emqx_retainer_index.erl | 4 ++-- apps/emqx_retainer/test/emqx_retainer_index_SUITE.erl | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/emqx_retainer/src/emqx_retainer_index.erl b/apps/emqx_retainer/src/emqx_retainer_index.erl index 0d739e2b0..3f5b87b90 100644 --- a/apps/emqx_retainer/src/emqx_retainer_index.erl +++ b/apps/emqx_retainer/src/emqx_retainer_index.erl @@ -176,11 +176,11 @@ condition([NIndex | OtherIndex], ['+' | OtherTokens], N, IndexMatch, OtherMatch) condition(Index, ['+' | OtherTokens], N, IndexMatch, OtherMatch) -> condition(Index, OtherTokens, N + 1, IndexMatch, ['_' | OtherMatch]); condition([NIndex | OtherIndex], [Token | OtherTokens], N, IndexMatch, OtherMatch) when - NIndex =:= N, is_binary(Token) + NIndex =:= N, is_binary(Token) orelse Token =:= '' -> condition(OtherIndex, OtherTokens, N + 1, [Token | IndexMatch], OtherMatch); condition(Index, [Token | OtherTokens], N, IndexMatch, OtherMatch) when - is_binary(Token) + is_binary(Token) orelse Token =:= '' -> condition(Index, OtherTokens, N + 1, IndexMatch, [Token | OtherMatch]). diff --git a/apps/emqx_retainer/test/emqx_retainer_index_SUITE.erl b/apps/emqx_retainer/test/emqx_retainer_index_SUITE.erl index ce37f2788..793df0410 100644 --- a/apps/emqx_retainer/test/emqx_retainer_index_SUITE.erl +++ b/apps/emqx_retainer/test/emqx_retainer_index_SUITE.erl @@ -193,6 +193,14 @@ t_condition_index(_Config) -> [1], [<<"a">>, '#'] ) + ), + + ?assertEqual( + {[1, 2, 3], {['', <<"saya">>, '_'], []}}, + emqx_retainer_index:condition( + [1, 2, 3], + ['', <<"saya">>, '+'] + ) ). t_restore_topic(_Config) -> From 4e767979278a37e46c100355b0a0a9ce0b3bcfba Mon Sep 17 00:00:00 2001 From: Ilya Averyanov Date: Fri, 10 Jun 2022 12:33:27 +0300 Subject: [PATCH 2/2] fix(retainer): add additional test --- apps/emqx_retainer/test/emqx_retainer_SUITE.erl | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/emqx_retainer/test/emqx_retainer_SUITE.erl b/apps/emqx_retainer/test/emqx_retainer_SUITE.erl index 100477634..74944f362 100644 --- a/apps/emqx_retainer/test/emqx_retainer_SUITE.erl +++ b/apps/emqx_retainer/test/emqx_retainer_SUITE.erl @@ -220,14 +220,22 @@ t_wildcard_subscription(_) -> <<"this is a retained message 2">>, [{qos, 0}, {retain, true}] ), + emqtt:publish( + C1, + <<"/x/y/z">>, + <<"this is a retained message 3">>, + [{qos, 0}, {retain, true}] + ), {ok, #{}, [0]} = emqtt:subscribe(C1, <<"retained/+">>, 0), {ok, #{}, [0]} = emqtt:subscribe(C1, <<"retained/+/b/#">>, 0), - ?assertEqual(3, length(receive_messages(3))), + {ok, #{}, [0]} = emqtt:subscribe(C1, <<"/+/y/#">>, 0), + ?assertEqual(4, length(receive_messages(4))), emqtt:publish(C1, <<"retained/0">>, <<"">>, [{qos, 0}, {retain, true}]), emqtt:publish(C1, <<"retained/1">>, <<"">>, [{qos, 0}, {retain, true}]), emqtt:publish(C1, <<"retained/a/b/c">>, <<"">>, [{qos, 0}, {retain, true}]), + emqtt:publish(C1, <<"/x/y/z">>, <<"">>, [{qos, 0}, {retain, true}]), ok = emqtt:disconnect(C1). t_message_expiry(_) ->