diff options
author | Matthew Sackman <matthew@rabbitmq.com> | 2010-06-07 18:15:38 +0100 |
---|---|---|
committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-06-07 18:15:38 +0100 |
commit | 114ba5599269b6cf38fca0874f6755f333cef7ca (patch) | |
tree | 5afd8817c91791dda7ea0153664e6fa335609bc0 | |
parent | e0f8517bf08e5beb968dc0aac50eec991073e751 (diff) | |
download | rabbitmq-server-bug22821.tar.gz |
The previous 'simplification' went a little too far, and failed to spot than in queue redeclaration we don't want to permit exclusive redeclaration of a non exclusive queuebug22821
-rw-r--r-- | src/rabbit_channel.erl | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 55218531..9127c44b 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -329,17 +329,18 @@ check_write_permitted(Resource, #ch{ username = Username}) -> check_read_permitted(Resource, #ch{ username = Username}) -> check_resource_access(Username, Resource, read). -check_exclusive_access(#amqqueue{exclusive_owner = Owner}, ReaderPid) - when Owner =:= none orelse Owner =:= ReaderPid -> +check_exclusive_access(#amqqueue{exclusive_owner = Owner}, Owner, _MatchType) -> ok; -check_exclusive_access(#amqqueue{name = QName}, _ReaderPid) -> +check_exclusive_access(#amqqueue{exclusive_owner = none}, _ReaderPid, lax) -> + ok; +check_exclusive_access(#amqqueue{name = QName}, _ReaderPid, _MatchType) -> rabbit_misc:protocol_error( resource_locked, "cannot obtain exclusive access to locked ~s", [rabbit_misc:rs(QName)]). with_exclusive_access_or_die(QName, ReaderPid, F) -> rabbit_amqqueue:with_or_die( - QName, fun (Q) -> check_exclusive_access(Q, ReaderPid), F(Q) end). + QName, fun (Q) -> check_exclusive_access(Q, ReaderPid, lax), F(Q) end). expand_queue_name_shortcut(<<>>, #ch{ most_recently_declared_queue = <<>> }) -> rabbit_misc:protocol_error( @@ -733,7 +734,7 @@ handle_method(#'queue.declare'{queue = QueueNameBin, %% We use this in both branches, because queue_declare may yet return an %% existing queue. Finish = fun (#amqqueue{name = QueueName} = Q) -> - check_exclusive_access(Q, Owner), + check_exclusive_access(Q, Owner, strict), check_configure_permitted(QueueName, State), case Owner of none -> ok; @@ -919,7 +920,7 @@ binding_action(Fun, ExchangeNameBin, QueueNameBin, RoutingKey, Arguments, ExchangeName = rabbit_misc:r(VHostPath, exchange, ExchangeNameBin), check_read_permitted(ExchangeName, State), case Fun(ExchangeName, QueueName, ActualRoutingKey, Arguments, - fun (_X, Q) -> check_exclusive_access(Q, ReaderPid) end) of + fun (_X, Q) -> check_exclusive_access(Q, ReaderPid, lax) end) of {error, exchange_not_found} -> rabbit_misc:not_found(ExchangeName); {error, queue_not_found} -> |