Skip to content

Commit 2616e01

Browse files
committed
AMQP filter expressions: handle invalid filters
An invalid application property filter could cause a function_clause that was returned to the client, eg `omq` output looked like this: ``` 2024/10/15 13:10:55 ERRO consumer failed to create a receiver id=1 error= │ *Error{Condition: amqp:internal-error, Description: Session error: function_clause │ [{rabbit_amqp_filtex,'-validate0/2-fun-0-', │ [{{symbol,<<"subject">>},{utf8,<<"var">>}}], │ [{file,"rabbit_amqp_filtex.erl"},{line,119}]}, │ {lists,map,2,[{file,"lists.erl"},{line,2077}]}, │ {rabbit_amqp_filtex,validate0,2,[{file,"rabbit_amqp_filtex.erl"},{line,119}]}, │ {rabbit_amqp_filtex,validate,1,[{file,"rabbit_amqp_filtex.erl"},{line,28}]}, │ {rabbit_amqp_session,parse_filters,2, │ [{file,"rabbit_amqp_session.erl"},{line,3068}]}, │ {rabbit_amqp_session,parse_filter,1, │ [{file,"rabbit_amqp_session.erl"},{line,3014}]}, │ {rabbit_amqp_session,'-handle_attach/2-fun-0-',21, │ [{file,"rabbit_amqp_session.erl"},{line,1371}]}, │ {rabbit_misc,with_exit_handler,2,[{file,"rabbit_misc.erl"},{line,465}]}], Info: map[]} ``` Now such filters are handled better
1 parent ab8814a commit 2616e01

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

deps/rabbit/src/rabbit_amqp_filtex.erl

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,16 @@ validate0(Descriptor, KVList0) when
119119
KVList = lists:map(fun({{utf8, Key}, {utf8, String}}) ->
120120
{Key, parse_string_modifier_prefix(String)};
121121
({{utf8, Key}, TaggedVal}) ->
122-
{Key, unwrap(TaggedVal)}
122+
{Key, unwrap(TaggedVal)};
123+
(_) ->
124+
invalid_filter
123125
end, KVList0),
124-
{ok, {application_properties, KVList}};
126+
case lists:member(invalid_filter, KVList) of
127+
false ->
128+
{ok, {application_properties, KVList}};
129+
true ->
130+
error
131+
end;
125132
validate0(_, _) ->
126133
error.
127134

deps/rabbit/test/amqp_filtex_SUITE.erl

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232

3333
all() ->
3434
[
35-
{group, cluster_size_1}
35+
{group, cluster_size_1},
36+
{group, filter_validation}
3637
].
3738

3839
groups() ->
@@ -44,6 +45,10 @@ groups() ->
4445
multiple_sections,
4546
filter_few_messages_from_many,
4647
string_modifier
48+
]},
49+
{filter_validation, [shuffle],
50+
[
51+
invalid_application_property_filter
4752
]}
4853
].
4954

@@ -579,6 +584,20 @@ string_modifier(Config) ->
579584
ok = end_session_sync(Session),
580585
ok = close_connection_sync(Connection).
581586

587+
invalid_application_property_filter(_Config) ->
588+
%% the only expression is invalid
589+
?assertEqual(error,
590+
rabbit_amqp_filtex:validate(
591+
{described,{symbol,?DESCRIPTOR_NAME_APPLICATION_PROPERTIES_FILTER},
592+
{map,[{{symbol,<<"subject">>},{utf8,<<"var">>}}]}})),
593+
594+
%% one expressions is valid but another one is not
595+
?assertEqual(error,
596+
rabbit_amqp_filtex:validate(
597+
{described,{symbol,?DESCRIPTOR_NAME_APPLICATION_PROPERTIES_FILTER},
598+
{map,[{{utf8, <<"valid">>}, {symbol, <<"no match">>}},
599+
{{symbol,<<"subject">>}, {utf8,<<"var">>}}]}})).
600+
582601
%% -------------------------------------------------------------------
583602
%% Helpers
584603
%% -------------------------------------------------------------------

0 commit comments

Comments
 (0)