diff options
author | Raimo Niskanen <[email protected]> | 2019-07-12 10:42:58 +0200 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2019-07-12 10:42:58 +0200 |
commit | 963937709bb6a50735df028b3f672f9d46d2f4b2 (patch) | |
tree | 1b486f76db1758a15835f61508f430b0d1e9bc63 /lib/ssl/src/tls_record.erl | |
parent | 220eeb3670e536b55c8e6812de86481cedd83bfe (diff) | |
parent | 7db6faacd845ced366bbd98aef1ce85856781e53 (diff) | |
download | otp-963937709bb6a50735df028b3f672f9d46d2f4b2.tar.gz otp-963937709bb6a50735df028b3f672f9d46d2f4b2.tar.bz2 otp-963937709bb6a50735df028b3f672f9d46d2f4b2.zip |
Merge branch 'raimo/ssl/fix-zero-fragment-buffer-handling/ERIERL-379/OTP-15328' into maint
* raimo/ssl/fix-zero-fragment-buffer-handling/ERIERL-379/OTP-15328:
Do not call dist_ctrl_put_data with empty binaries
Refine the queue code
Fix extracting 0 bytes from queue
Diffstat (limited to 'lib/ssl/src/tls_record.erl')
-rw-r--r-- | lib/ssl/src/tls_record.erl | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/lib/ssl/src/tls_record.erl b/lib/ssl/src/tls_record.erl index a5c550a429..2aeab98929 100644 --- a/lib/ssl/src/tls_record.erl +++ b/lib/ssl/src/tls_record.erl @@ -514,16 +514,27 @@ validate_tls_record_length(Versions, {_,Size0,_} = Q0, SslOpts, Acc, Type, Versi end. -binary_from_front(SplitSize, {Front,Size,Rear}) -> +binary_from_front(0, Q) -> + {<<>>, Q}; +binary_from_front(SplitSize, {Front,Size,Rear}) when SplitSize =< Size -> binary_from_front(SplitSize, Front, Size, Rear, []). %% -binary_from_front(SplitSize, [], Size, [_] = Rear, Acc) -> - %% Optimize a simple case - binary_from_front(SplitSize, Rear, Size, [], Acc); +%% SplitSize > 0 and there is at least SplitSize bytes buffered in Front and Rear binary_from_front(SplitSize, [], Size, Rear, Acc) -> - binary_from_front(SplitSize, lists:reverse(Rear), Size, [], Acc); + case Rear of + %% Avoid lists:reverse/1 for simple cases. + %% Case clause for [] to avoid infinite loop. + [_] -> + binary_from_front(SplitSize, Rear, Size, [], Acc); + [Bin2,Bin1] -> + binary_from_front(SplitSize, [Bin1,Bin2], Size, [], Acc); + [Bin3,Bin2,Bin1] -> + binary_from_front(SplitSize, [Bin1,Bin2,Bin3], Size, [], Acc); + [_,_,_|_] -> + binary_from_front(SplitSize, lists:reverse(Rear), Size, [], Acc) + end; binary_from_front(SplitSize, [Bin|Front], Size, Rear, []) -> - %% Optimize a frequent case + %% Optimize the frequent case when the accumulator is empty BinSize = byte_size(Bin), if SplitSize < BinSize -> |