File 4422-Handle-compressed-tar-file-padding.patch of Package erlang
From a5892472a7b148546d9bbde186a73cfc9adc9f8c Mon Sep 17 00:00:00 2001
From: Simon Cornish <7t9jna402@sneakemail.com>
Date: Mon, 3 Oct 2022 11:23:10 -0700
Subject: [PATCH 2/2] Handle compressed tar file padding
---
lib/stdlib/src/erl_tar.erl | 17 +++++++++++++++--
lib/stdlib/test/tar_SUITE.erl | 15 +++++++++++++--
lib/stdlib/test/tar_SUITE_data/example_pad.tgz | Bin 0 -> 10240 bytes
3 files changed, 28 insertions(+), 4 deletions(-)
create mode 100644 lib/stdlib/test/tar_SUITE_data/example_pad.tgz
diff --git a/lib/stdlib/src/erl_tar.erl b/lib/stdlib/src/erl_tar.erl
index dbabcb14bf..da188c1bf1 100644
--- a/lib/stdlib/src/erl_tar.erl
+++ b/lib/stdlib/src/erl_tar.erl
@@ -324,10 +324,17 @@ do_open(Name, Mode) when is_list(Mode) ->
open1({binary,Bin0}=Handle, read, _Raw, Opts) when is_binary(Bin0) ->
Bin = case lists:member(compressed, Opts) of
true ->
+ %% emulate file:open with Modes = [compressed_one ...]
+ Z = zlib:open(),
+ zlib:inflateInit(Z, 31, cut),
try
- zlib:gunzip(Bin0)
+ IoList = zlib:inflate(Z, Bin0),
+ zlib:inflateEnd(Z),
+ iolist_to_binary(IoList)
catch
_:_ -> Bin0
+ after
+ zlib:close(Z)
end;
false ->
Bin0
@@ -354,7 +361,13 @@ open1({file, Fd}=Handle, read, [raw], Opts) ->
end;
open1({file, _Fd}=Handle, read, [], _Opts) ->
{error, {Handle, {incompatible_option, cooked}}};
-open1(Name, Access, Raw, Opts) when is_list(Name) or is_binary(Name) ->
+open1(Name, Access, Raw, Opts0) when is_list(Name); is_binary(Name) ->
+ Opts = case lists:member(compressed, Opts0) andalso Access == read of
+ true ->
+ [compressed_one | (Opts0 -- [compressed])];
+ false ->
+ Opts0
+ end,
case file:open(Name, Raw ++ [binary, Access|Opts]) of
{ok, File} ->
{ok, #reader{handle=File,access=Access,func=fun file_op/2}};
diff --git a/lib/stdlib/test/tar_SUITE.erl b/lib/stdlib/test/tar_SUITE.erl
index 38b01354ae..294741574c 100644
--- a/lib/stdlib/test/tar_SUITE.erl
+++ b/lib/stdlib/test/tar_SUITE.erl
@@ -26,7 +26,7 @@
create_long_names/1, bad_tar/1, errors/1, extract_from_binary/1,
extract_from_binary_compressed/1, extract_filtered/1,
extract_from_open_file/1, symlinks/1, open_add_close/1, cooked_compressed/1,
- memory/1,unicode/1,read_other_implementations/1,
+ memory/1,unicode/1,read_other_implementations/1,bsdtgz/1,
sparse/1, init/1, leading_slash/1, dotdot/1,
roundtrip_metadata/1, apply_file_info_opts/1,
incompatible_options/1]).
@@ -42,7 +42,7 @@ all() ->
extract_from_binary_compressed, extract_from_open_file,
extract_filtered,
symlinks, open_add_close, cooked_compressed, memory, unicode,
- read_other_implementations,
+ read_other_implementations, bsdtgz,
sparse,init,leading_slash,dotdot,roundtrip_metadata,
apply_file_info_opts,incompatible_options].
@@ -863,6 +863,17 @@ do_read_other_implementations([File|Rest], DataDir) ->
{ok, _} = erl_tar:extract(Full, [memory]),
do_read_other_implementations(Rest, DataDir).
+%% test block padding with compressed tar from bsdtar or tape
+bsdtgz(Config) when is_list(Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ File = "example_pad.tgz",
+ Full = filename:join(DataDir, File),
+ io:format("~nTrying ~s", [File]),
+ Table = ["autofs.conf","rpc"],
+ {ok, Table} = erl_tar:table(Full, [compressed]),
+ {ok, Bin} = file:read_file(Full),
+ {ok, Table} = erl_tar:table({binary, Bin}, [compressed]),
+ verify_ports(Config).
%% Test handling of sparse files
sparse(Config) when is_list(Config) ->
diff --git a/lib/stdlib/test/tar_SUITE_data/example_pad.tgz b/lib/stdlib/test/tar_SUITE_data/example_pad.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..508ab1b46105e150c89331827bbe9054606b40ae
GIT binary patch
literal 10240
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
P01yBK00BVY|486ps!5Hh
literal 0
HcmV?d00001
--
2.35.3