diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_binary_generator.erl | 9 | ||||
| -rw-r--r-- | src/rabbit_plugin_activator.erl | 1 | ||||
| -rw-r--r-- | src/rabbit_reader.erl | 7 |
3 files changed, 12 insertions, 5 deletions
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. |
