Skip to content

Commit 586c35d

Browse files
author
Erlang/OTP
committed
Merge branch 'kuba/ssh/window_badmatch/GH-9655/OTP-19707' into maint-27
* kuba/ssh/window_badmatch/GH-9655/OTP-19707: ssh: ssh_sftp improve window related error handling
2 parents d651454 + 99ff120 commit 586c35d

File tree

1 file changed

+41
-42
lines changed

1 file changed

+41
-42
lines changed

lib/ssh/src/ssh_sftp.erl

Lines changed: 41 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,14 +1024,12 @@ read_file(Pid, Name) ->
10241024
Timeout :: timeout(),
10251025
Error :: {error, reason()}.
10261026
read_file(Pid, Name, FileOpTimeout) ->
1027-
case open(Pid, Name, [read, binary], FileOpTimeout) of
1028-
{ok, Handle} ->
1029-
{ok,{_WindowSz,PacketSz}} = recv_window(Pid, FileOpTimeout),
1030-
Res = read_file_loop(Pid, Handle, PacketSz, FileOpTimeout, []),
1031-
close(Pid, Handle),
1032-
Res;
1033-
Error ->
1034-
Error
1027+
maybe
1028+
{ok, Handle} ?= open(Pid, Name, [read, binary], FileOpTimeout),
1029+
{ok, {_WindowSz, PacketSz}} ?= recv_window(Pid, FileOpTimeout),
1030+
Res = read_file_loop(Pid, Handle, PacketSz, FileOpTimeout, []),
1031+
close(Pid, Handle),
1032+
Res
10351033
end.
10361034

10371035
read_file_loop(Pid, Handle, PacketSz, FileOpTimeout, Acc) ->
@@ -1066,15 +1064,12 @@ overwritten if it exists.
10661064
write_file(Pid, Name, List, FileOpTimeout) when is_list(List) ->
10671065
write_file(Pid, Name, to_bin(List), FileOpTimeout);
10681066
write_file(Pid, Name, Bin, FileOpTimeout) ->
1069-
case open(Pid, Name, [write, binary], FileOpTimeout) of
1070-
{ok, Handle} ->
1071-
{ok,{_Window,Packet}} = send_window(Pid, FileOpTimeout),
1072-
Res = write_file_loop(Pid, Handle, 0, Bin, byte_size(Bin), Packet,
1073-
FileOpTimeout),
1074-
close(Pid, Handle, FileOpTimeout),
1075-
Res;
1076-
Error ->
1077-
Error
1067+
maybe
1068+
{ok, Handle} ?= open(Pid, Name, [write, binary], FileOpTimeout),
1069+
{ok, {_Window, Packet}} ?= send_window(Pid, FileOpTimeout),
1070+
Res = write_file_loop(Pid, Handle, 0, Bin, byte_size(Bin), Packet, FileOpTimeout),
1071+
close(Pid, Handle, FileOpTimeout),
1072+
Res
10781073
end.
10791074

10801075
write_file_loop(_Pid, _Handle, _Pos, _Bin, 0, _PacketSz,_FileOpTimeout) ->
@@ -1896,8 +1891,10 @@ to_bin(Data) when is_binary(Data) -> Data.
18961891

18971892

18981893
read_repeat(Pid, Handle, Len, FileOpTimeout) ->
1899-
{ok,{_WindowSz,PacketSz}} = recv_window(Pid, FileOpTimeout),
1900-
read_rpt(Pid, Handle, Len, PacketSz, FileOpTimeout, <<>>).
1894+
maybe
1895+
{ok, {_WindowSz, PacketSz}} ?= recv_window(Pid, FileOpTimeout),
1896+
read_rpt(Pid, Handle, Len, PacketSz, FileOpTimeout, <<>>)
1897+
end.
19011898

19021899
read_rpt(Pid, Handle, WantedLen, PacketSz, FileOpTimeout, Acc) when WantedLen > 0 ->
19031900
case read(Pid, Handle, min(WantedLen,PacketSz), FileOpTimeout) of
@@ -1915,8 +1912,10 @@ read_rpt(_Pid, _Handle, WantedLen, _PacketSz, _FileOpTimeout, Acc) when WantedLe
19151912
write_to_remote_tar(_Pid, _SftpHandle, <<>>, _FileOpTimeout) ->
19161913
ok;
19171914
write_to_remote_tar(Pid, SftpHandle, Bin, FileOpTimeout) ->
1918-
{ok,{_Window,Packet}} = send_window(Pid, FileOpTimeout),
1919-
write_file_loop(Pid, SftpHandle, 0, Bin, byte_size(Bin), Packet, FileOpTimeout).
1915+
maybe
1916+
{ok, {_Window, Packet}} ?= send_window(Pid, FileOpTimeout),
1917+
write_file_loop(Pid, SftpHandle, 0, Bin, byte_size(Bin), Packet, FileOpTimeout)
1918+
end.
19201919

19211920
position_buf(Pid, SftpHandle, BufHandle, Pos, FileOpTimeout) ->
19221921
{ok,#bufinf{mode = Mode,
@@ -1953,18 +1952,19 @@ position_buf(Pid, SftpHandle, BufHandle, Pos, FileOpTimeout) ->
19531952
end.
19541953

19551954
read_buf(Pid, SftpHandle, BufHandle, WantedLen, FileOpTimeout) ->
1956-
{ok,{_Window,Packet}} = send_window(Pid, FileOpTimeout),
1957-
{ok,B0} = call(Pid, {get_bufinf,BufHandle}, FileOpTimeout),
1958-
case do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout, B0) of
1959-
{ok,ResultBin,B} ->
1960-
call(Pid, {put_bufinf,BufHandle,B}, FileOpTimeout),
1961-
{ok,ResultBin};
1962-
{error,Error} ->
1963-
{error,Error};
1964-
{eof,B} ->
1965-
call(Pid, {put_bufinf,BufHandle,B}, FileOpTimeout),
1966-
eof
1967-
end.
1955+
maybe
1956+
{ok, {_Window, Packet}} ?= send_window(Pid, FileOpTimeout),
1957+
{ok, B0} ?= call(Pid, {get_bufinf,BufHandle}, FileOpTimeout),
1958+
{ok, ResultBin, B} ?= do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout, B0),
1959+
call(Pid, {put_bufinf, BufHandle, B}, FileOpTimeout),
1960+
{ok,ResultBin}
1961+
else
1962+
{error, Error} ->
1963+
{error,Error};
1964+
{eof, BufInf} ->
1965+
call(Pid, {put_bufinf, BufHandle, BufInf}, FileOpTimeout),
1966+
eof
1967+
end.
19681968

19691969
do_the_read_buf(_Pid, _SftpHandle, WantedLen, _Packet, _FileOpTimeout,
19701970
B=#bufinf{plain_text_buf=PlainBuf0,
@@ -2016,15 +2016,14 @@ do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout, B=#bufinf{enc
20162016

20172017

20182018
write_buf(Pid, SftpHandle, BufHandle, PlainBin, FileOpTimeout) ->
2019-
{ok,{_Window,Packet}} = send_window(Pid, FileOpTimeout),
2020-
{ok,B0=#bufinf{plain_text_buf=PTB}} = call(Pid, {get_bufinf,BufHandle}, FileOpTimeout),
2021-
case do_the_write_buf(Pid, SftpHandle, Packet, FileOpTimeout,
2022-
B0#bufinf{plain_text_buf = <<PTB/binary,PlainBin/binary>>}) of
2023-
{ok, B} ->
2024-
call(Pid, {put_bufinf,BufHandle,B}, FileOpTimeout),
2025-
ok;
2026-
{error,Error} ->
2027-
{error,Error}
2019+
maybe
2020+
{ok, {_Window, Packet}} ?= send_window(Pid, FileOpTimeout),
2021+
{ok, B0=#bufinf{plain_text_buf=PTB}} ?= call(Pid, {get_bufinf,BufHandle}, FileOpTimeout),
2022+
{ok, B} ?=
2023+
do_the_write_buf(Pid, SftpHandle, Packet, FileOpTimeout,
2024+
B0#bufinf{plain_text_buf = <<PTB/binary,PlainBin/binary>>}),
2025+
call(Pid, {put_bufinf,BufHandle,B}, FileOpTimeout),
2026+
ok
20282027
end.
20292028

20302029
do_the_write_buf(Pid, SftpHandle, Packet, FileOpTimeout,

0 commit comments

Comments
 (0)