tar: exclude files before updating hardlink info list

When excluding one file, and including another file that is a hardlink
of the excluded file, it should be stored as an ordinary file.

function                                             old     new   delta
writeFileToTarball                                   489     493      +4

Signed-off-by: Harald van Dijk <harald@gigawatt.nl>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Harald van Dijk 2021-06-27 15:11:57 +01:00 committed by Denys Vlasenko
parent 3d40dfabe1
commit 8ae6a4344d

View File

@ -507,6 +507,9 @@ static int FAST_FUNC writeFileToTarball(struct recursive_state *state,
if (header_name[0] == '\0') if (header_name[0] == '\0')
return TRUE; return TRUE;
if (exclude_file(tbInfo->excludeList, header_name))
return SKIP; /* "do not recurse on this directory", no error message printed */
/* It is against the rules to archive a socket */ /* It is against the rules to archive a socket */
if (S_ISSOCK(statbuf->st_mode)) { if (S_ISSOCK(statbuf->st_mode)) {
bb_error_msg("%s: socket ignored", fileName); bb_error_msg("%s: socket ignored", fileName);
@ -540,9 +543,6 @@ static int FAST_FUNC writeFileToTarball(struct recursive_state *state,
return TRUE; return TRUE;
} }
if (exclude_file(tbInfo->excludeList, header_name))
return SKIP;
# if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS # if !ENABLE_FEATURE_TAR_GNU_EXTENSIONS
if (strlen(header_name) >= NAME_SIZE) { if (strlen(header_name) >= NAME_SIZE) {
bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); bb_simple_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
@ -555,13 +555,13 @@ static int FAST_FUNC writeFileToTarball(struct recursive_state *state,
/* open the file we want to archive, and make sure all is well */ /* open the file we want to archive, and make sure all is well */
inputFileFd = open_or_warn(fileName, O_RDONLY); inputFileFd = open_or_warn(fileName, O_RDONLY);
if (inputFileFd < 0) { if (inputFileFd < 0) {
return FALSE; return FALSE; /* make recursive_action() return FALSE */
} }
} }
/* Add an entry to the tarball */ /* Add an entry to the tarball */
if (writeTarHeader(tbInfo, header_name, fileName, statbuf) == FALSE) { if (writeTarHeader(tbInfo, header_name, fileName, statbuf) == FALSE) {
return FALSE; return FALSE; /* make recursive_action() return FALSE */
} }
/* If it was a regular file, write out the body */ /* If it was a regular file, write out the body */