From 54e8284d883b11a83ec48edb41c9a15d657bae8e Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Tue, 2 Jul 2019 14:12:18 +0200 Subject: Fix extracting 0 bytes from queue --- lib/ssl/src/tls_record.erl | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'lib/ssl/src/tls_record.erl') diff --git a/lib/ssl/src/tls_record.erl b/lib/ssl/src/tls_record.erl index 38022030ee..afbf95948d 100644 --- a/lib/ssl/src/tls_record.erl +++ b/lib/ssl/src/tls_record.erl @@ -489,16 +489,19 @@ validate_tls_record_length(Versions, {_,Size0,_} = Q0, Acc, Type, Version, Lengt 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, []). %% +%% SplitSize > 0 and there is at least SplitSize bytes buffered in Front and Rear binary_from_front(SplitSize, [], Size, [_] = Rear, Acc) -> - %% Optimize a simple case + %% Optimize a simple case - avoid lists:reverse/1 binary_from_front(SplitSize, Rear, Size, [], Acc); -binary_from_front(SplitSize, [], Size, Rear, Acc) -> +binary_from_front(SplitSize, [], Size, [_|_] = Rear, Acc) -> binary_from_front(SplitSize, lists:reverse(Rear), Size, [], Acc); 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 -> -- cgit v1.2.3 From bf0f197f566b688df0e0c6a5a343019643732d86 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Wed, 3 Jul 2019 11:47:57 +0200 Subject: Refine the queue code --- lib/ssl/src/tls_record.erl | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'lib/ssl/src/tls_record.erl') diff --git a/lib/ssl/src/tls_record.erl b/lib/ssl/src/tls_record.erl index afbf95948d..20598ea702 100644 --- a/lib/ssl/src/tls_record.erl +++ b/lib/ssl/src/tls_record.erl @@ -495,11 +495,19 @@ binary_from_front(SplitSize, {Front,Size,Rear}) when SplitSize =< Size -> binary_from_front(SplitSize, Front, Size, Rear, []). %% %% SplitSize > 0 and there is at least SplitSize bytes buffered in Front and Rear -binary_from_front(SplitSize, [], Size, [_] = Rear, Acc) -> - %% Optimize a simple case - avoid lists:reverse/1 - binary_from_front(SplitSize, Rear, Size, [], Acc); -binary_from_front(SplitSize, [], Size, [_|_] = Rear, Acc) -> - binary_from_front(SplitSize, lists:reverse(Rear), Size, [], Acc); +binary_from_front(SplitSize, [], Size, Rear, 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 the frequent case when the accumulator is empty BinSize = byte_size(Bin), -- cgit v1.2.3