diff --git a/src/emqx_protocol.erl b/src/emqx_protocol.erl index 013fa3c41..cee0af03a 100644 --- a/src/emqx_protocol.erl +++ b/src/emqx_protocol.erl @@ -208,6 +208,9 @@ received(Packet = ?PACKET(Type), PState) -> true -> {Packet1, PState1} = preprocess_properties(Packet, PState), process_packet(Packet1, inc_stats(recv, Type, PState1)); + {'EXIT', {topic_filters_invalid, _Stacktrace}} -> + deliver({disconnect, ?RC_PROTOCOL_ERROR}, PState), + {error, topic_filters_invalid, PState}; {'EXIT', {Reason, _Stacktrace}} -> deliver({disconnect, ?RC_MALFORMED_PACKET}, PState), {error, Reason, PState} diff --git a/src/emqx_topic.erl b/src/emqx_topic.erl index c244a40b3..3dcad0b33 100644 --- a/src/emqx_topic.erl +++ b/src/emqx_topic.erl @@ -184,9 +184,16 @@ parse(Topic = <<"$share/", _/binary>>, #{share := _Group}) -> error({invalid_topic, Topic}); parse(<<"$queue/", Topic1/binary>>, Options) -> parse(Topic1, maps:put(share, <<"$queue">>, Options)); -parse(<<"$share/", Topic1/binary>>, Options) -> - [Group, Topic2] = binary:split(Topic1, <<"/">>), - {Topic2, maps:put(share, Group, Options)}; +parse(Topic = <<"$share/", Topic1/binary>>, Options) -> + case binary:split(Topic1, <<"/">>) of + [<<>>] -> error({invalid_topic, Topic}); + [_] -> error({invalid_topic, Topic}); + [Group, Topic2] -> + case binary:match(Group, [<<"/">>, <<"+">>, <<"#">>]) of + nomatch -> error({invalid_topic, Topic}); + _ -> {Topic2, maps:put(share, Group, Options)} + end + end; parse(Topic, Options) -> {Topic, Options}.