summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2010-06-07 18:15:38 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2010-06-07 18:15:38 +0100
commit114ba5599269b6cf38fca0874f6755f333cef7ca (patch)
tree5afd8817c91791dda7ea0153664e6fa335609bc0
parente0f8517bf08e5beb968dc0aac50eec991073e751 (diff)
downloadrabbitmq-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.erl13
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} ->