From b5208f8d2bb3de1ddddce120a0575954fd9e6c0d Mon Sep 17 00:00:00 2001 From: Sean McEvoy Date: Wed, 5 Oct 2022 13:19:02 +0100 Subject: [PATCH] added max chunk check on recv --- src/yaws.erl | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/yaws.erl b/src/yaws.erl index c9b29192..6d75d260 100644 --- a/src/yaws.erl +++ b/src/yaws.erl @@ -2548,14 +2548,24 @@ get_nslookup_pref([], Result) -> %% http/tcp send receive functions %% %% -do_recv(Sock, Num, nossl) -> - gen_tcp:recv(Sock, Num, (get(gc))#gconf.keepalive_timeout); -do_recv(Sock, Num, ssl) -> - ssl:recv(Sock, Num, (get(gc))#gconf.keepalive_timeout). -do_recv(Sock, Num, nossl, Timeout) -> +-define(MaxPacketSize, 8 * 1024 * 1024). + +do_recv(Sock, Num, SSL) -> + do_recv(Sock, Num, SSL, (get(gc))#gconf.keepalive_timeout). + +do_recv(Sock, Num, nossl, Timeout) when Num =< ?MaxPacketSize -> gen_tcp:recv(Sock, Num, Timeout); -do_recv(Sock, Num, ssl, Timeout) -> - ssl:recv(Sock, Num, Timeout). +do_recv(Sock, Num, ssl, Timeout) when Num =< ?MaxPacketSize -> + ssl:recv(Sock, Num, Timeout); +do_recv(Sock, Num, SSL, Timeout) when Num > ?MaxPacketSize -> + case do_recv(Sock, ?MaxPacketSize, SSL, Timeout) of + {error, Reason} -> {error, Reason}; + {ok, Data1} -> + case do_recv(Sock, Num - ?MaxPacketSize, SSL, Timeout) of + {error, Reason} -> {error, Reason}; + {ok, Data2} -> {ok, <>} + end + end. cli_recv(S, Num, SslBool) -> Res = do_recv(S, Num, SslBool),