From 42b3c9b4d6ce08e6e495fe03da68dce9ac1166d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=AD=90=E5=8D=9A?= <349832309@qq.com> Date: Thu, 6 Sep 2018 14:47:34 +0800 Subject: [PATCH] Send DISCONNECT packet with reason code PROTOCOL_ERROR when topic is empty, add checks for topics --- src/emqx_protocol.erl | 3 +++ src/emqx_topic.erl | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) 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}.