summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2010-05-23 09:27:12 +0100
committerMatthew Sackman <matthew@lshift.net>2010-05-23 09:27:12 +0100
commit239aad5cf469d24c54e93c9137f3bb5717a089b2 (patch)
tree5d905b7caf003949f3da4c642fc85ce86e4449d0
parent69bc3e33a6840e66ef539441d6845024d30d0260 (diff)
parentce43301b1a8554e9687c4d955d40e1931d13b832 (diff)
downloadrabbitmq-server-git-239aad5cf469d24c54e93c9137f3bb5717a089b2.tar.gz
Merging default into bug 21673
-rw-r--r--packaging/macports/Makefile2
-rw-r--r--src/rabbit_binary_generator.erl9
-rw-r--r--src/rabbit_plugin_activator.erl1
-rw-r--r--src/rabbit_reader.erl7
-rw-r--r--src/tcp_acceptor.erl7
5 files changed, 20 insertions, 6 deletions
diff --git a/packaging/macports/Makefile b/packaging/macports/Makefile
index 0ef7dd5e73..4ad4c30b2c 100644
--- a/packaging/macports/Makefile
+++ b/packaging/macports/Makefile
@@ -39,7 +39,7 @@ macports: dirs $(DEST)/Portfile
$(DEST)/files/rabbitmq-script-wrapper
cp patch-org.macports.rabbitmq-server.plist.diff $(DEST)/files
if [ -n "$(MACPORTS_USERHOST)" ] ; then \
- tar cf - -C $(MACPORTS_DIR) . | ssh $(SSH_OPTS) lshift@macrabbit ' \
+ tar cf - -C $(MACPORTS_DIR) . | ssh $(SSH_OPTS) $(MACPORTS_USERHOST) ' \
d="/tmp/mkportindex.$$$$" ; \
mkdir $$d \
&& cd $$d \
diff --git a/src/rabbit_binary_generator.erl b/src/rabbit_binary_generator.erl
index ed84373585..27a1275a31 100644
--- a/src/rabbit_binary_generator.erl
+++ b/src/rabbit_binary_generator.erl
@@ -118,10 +118,11 @@ build_content_frames(SizeAcc, FramesAcc, FragSizeRem, FragAcc,
[Frag | Frags], BodyPayloadMax, ChannelInt) ->
Size = size(Frag),
{NewFragSizeRem, NewFragAcc, NewFrags} =
- case Size =< FragSizeRem of
- true -> {FragSizeRem - Size, [Frag | FragAcc], Frags};
- false -> <<Head:FragSizeRem/binary, Tail/binary>> = Frag,
- {0, [Head | FragAcc], [Tail | Frags]}
+ if Size == 0 -> {FragSizeRem, FragAcc, Frags};
+ Size =< FragSizeRem -> {FragSizeRem - Size, [Frag | FragAcc], Frags};
+ true -> <<Head:FragSizeRem/binary, Tail/binary>> =
+ Frag,
+ {0, [Head | FragAcc], [Tail | Frags]}
end,
build_content_frames(SizeAcc, FramesAcc, NewFragSizeRem, NewFragAcc,
NewFrags, BodyPayloadMax, ChannelInt).
diff --git a/src/rabbit_plugin_activator.erl b/src/rabbit_plugin_activator.erl
index 274981efed..ef3c5cc250 100644
--- a/src/rabbit_plugin_activator.erl
+++ b/src/rabbit_plugin_activator.erl
@@ -108,6 +108,7 @@ start() ->
WApp == stdlib;
WApp == kernel;
WApp == sasl;
+ WApp == crypto;
WApp == os_mon -> false;
_ -> true
end]),
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 5cf519b795..c6bd2973e7 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -52,6 +52,7 @@
-define(NORMAL_TIMEOUT, 3).
-define(CLOSING_TIMEOUT, 1).
-define(CHANNEL_TERMINATION_TIMEOUT, 3).
+-define(SLEEP_BEFORE_SILENT_CLOSE, 3000).
%---------------------------------------------------------------------------
@@ -575,7 +576,11 @@ handle_method0(MethodName, FieldsBin, State) ->
end,
case State#v1.connection_state of
running -> send_exception(State, 0, CompleteReason);
- Other -> throw({channel0_error, Other, CompleteReason})
+ %% We don't trust the client at this point - force
+ %% them to wait for a bit so they can't DOS us with
+ %% repeated failed logins etc.
+ Other -> timer:sleep(?SLEEP_BEFORE_SILENT_CLOSE),
+ throw({channel0_error, Other, CompleteReason})
end
end.
diff --git a/src/tcp_acceptor.erl b/src/tcp_acceptor.erl
index 3b23daa5c1..cc4982c9cb 100644
--- a/src/tcp_acceptor.erl
+++ b/src/tcp_acceptor.erl
@@ -75,6 +75,13 @@ handle_info({inet_async, LSock, Ref, {ok, Sock}},
error_logger:info_msg("accepted TCP connection on ~s:~p from ~s:~p~n",
[inet_parse:ntoa(Address), Port,
inet_parse:ntoa(PeerAddress), PeerPort]),
+ %% In the event that somebody floods us with connections we can spew
+ %% the above message at error_logger faster than it can keep up.
+ %% So error_logger's mailbox grows unbounded until we eat all the
+ %% memory available and crash. So here's a meaningless synchronous call
+ %% to the underlying gen_event mechanism - when it returns the mailbox
+ %% is drained.
+ gen_event:which_handlers(error_logger),
%% handle
file_handle_cache:release_on_death(apply(M, F, A ++ [Sock]))
catch {inet_error, Reason} ->