diff options
author | Björn Gustavsson <[email protected]> | 2014-04-09 16:30:49 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2014-05-08 14:26:27 +0200 |
commit | bb2b84c35e75ae80174ef54dad7babf6c6fa9075 (patch) | |
tree | 6d108ff7075cd594b4529a7c0f7c38c2f4833e63 /lib/stdlib/src/erl_tar.erl | |
parent | 61138cb31e1f6ad44d3ca54e668de9d2d4adb2ec (diff) | |
download | otp-bb2b84c35e75ae80174ef54dad7babf6c6fa9075.tar.gz otp-bb2b84c35e75ae80174ef54dad7babf6c6fa9075.tar.bz2 otp-bb2b84c35e75ae80174ef54dad7babf6c6fa9075.zip |
Correct end of tape marker
The POSIX standard for tar says that there must be at least
two 512-bytes zero blocks at the end of the tar archive file.
Our implementation would only emit a single 512-byte zero block if the
size of the last file was in the range 18*512 through 19*512-1 (modulo
20*512). GNU tar would correctly unpack such tar archive file, but
would emit a warning:
tar: A lone zero block at 20
Diffstat (limited to 'lib/stdlib/src/erl_tar.erl')
-rw-r--r-- | lib/stdlib/src/erl_tar.erl | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/lib/stdlib/src/erl_tar.erl b/lib/stdlib/src/erl_tar.erl index 89b4ea6c04..acf7a5cd40 100644 --- a/lib/stdlib/src/erl_tar.erl +++ b/lib/stdlib/src/erl_tar.erl @@ -397,9 +397,17 @@ to_string(Str0, Count) -> pad_file(File) -> {ok,Position} = file:position(File, {cur,0}), - %% There must be at least one empty record at the end of the file. - Zeros = zeroes(?block_size - (Position rem ?block_size)), - file:write(File, Zeros). + %% There must be at least two zero records at the end. + Fill = case ?block_size - (Position rem ?block_size) of + Fill0 when Fill0 < 2*?record_size -> + %% We need to another block here to ensure that there + %% are at least two zero records at the end. + Fill0 + ?block_size; + Fill0 -> + %% Large enough. + Fill0 + end, + file:write(File, zeroes(Fill)). split_filename(Name) when length(Name) =< ?th_name_len -> {"", Name}; |