mirror of https://github.com/mirror/busybox.git
tar: strip leading '/' BEFORE memorizing hardlink's name
function old new delta writeFileToTarball 1362 1352 -10 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-10) Total: -10 bytes1_8_stable
parent
46a530626d
commit
86e0a22ec6
|
@ -386,35 +386,6 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
|
||||||
const char *header_name;
|
const char *header_name;
|
||||||
int inputFileFd = -1;
|
int inputFileFd = -1;
|
||||||
|
|
||||||
/*
|
|
||||||
* Check to see if we are dealing with a hard link.
|
|
||||||
* If so -
|
|
||||||
* Treat the first occurance of a given dev/inode as a file while
|
|
||||||
* treating any additional occurances as hard links. This is done
|
|
||||||
* by adding the file information to the HardLinkInfo linked list.
|
|
||||||
*/
|
|
||||||
tbInfo->hlInfo = NULL;
|
|
||||||
if (statbuf->st_nlink > 1) {
|
|
||||||
tbInfo->hlInfo = findHardLinkInfo(tbInfo->hlInfoHead, statbuf);
|
|
||||||
if (tbInfo->hlInfo == NULL)
|
|
||||||
addHardLinkInfo(&tbInfo->hlInfoHead, statbuf, fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* It is against the rules to archive a socket */
|
|
||||||
if (S_ISSOCK(statbuf->st_mode)) {
|
|
||||||
bb_error_msg("%s: socket ignored", fileName);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* It is a bad idea to store the archive we are in the process of creating,
|
|
||||||
* so check the device and inode to be sure that this particular file isn't
|
|
||||||
* the new tarball */
|
|
||||||
if (tbInfo->statBuf.st_dev == statbuf->st_dev &&
|
|
||||||
tbInfo->statBuf.st_ino == statbuf->st_ino) {
|
|
||||||
bb_error_msg("%s: file is the archive; skipping", fileName);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
header_name = fileName;
|
header_name = fileName;
|
||||||
while (header_name[0] == '/') {
|
while (header_name[0] == '/') {
|
||||||
static smallint warned;
|
static smallint warned;
|
||||||
|
@ -426,19 +397,49 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
|
||||||
header_name++;
|
header_name++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (header_name[0] == '\0')
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check to see if we are dealing with a hard link.
|
||||||
|
* If so -
|
||||||
|
* Treat the first occurance of a given dev/inode as a file while
|
||||||
|
* treating any additional occurances as hard links. This is done
|
||||||
|
* by adding the file information to the HardLinkInfo linked list.
|
||||||
|
*/
|
||||||
|
tbInfo->hlInfo = NULL;
|
||||||
|
if (statbuf->st_nlink > 1) {
|
||||||
|
tbInfo->hlInfo = findHardLinkInfo(tbInfo->hlInfoHead, statbuf);
|
||||||
|
if (tbInfo->hlInfo == NULL)
|
||||||
|
addHardLinkInfo(&tbInfo->hlInfoHead, statbuf, header_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* It is against the rules to archive a socket */
|
||||||
|
if (S_ISSOCK(statbuf->st_mode)) {
|
||||||
|
bb_error_msg("%s: socket ignored", fileName);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* It is a bad idea to store the archive we are in the process of creating,
|
||||||
|
* so check the device and inode to be sure that this particular file isn't
|
||||||
|
* the new tarball */
|
||||||
|
if (tbInfo->statBuf.st_dev == statbuf->st_dev
|
||||||
|
&& tbInfo->statBuf.st_ino == statbuf->st_ino
|
||||||
|
) {
|
||||||
|
bb_error_msg("%s: file is the archive; skipping", fileName);
|
||||||
|
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(fileName) >= NAME_SIZE) {
|
if (strlen(header_name) >= NAME_SIZE) {
|
||||||
bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
|
bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported");
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (header_name[0] == '\0')
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (exclude_file(tbInfo->excludeList, header_name))
|
|
||||||
return SKIP;
|
|
||||||
|
|
||||||
/* Is this a regular file? */
|
/* Is this a regular file? */
|
||||||
if (tbInfo->hlInfo == NULL && S_ISREG(statbuf->st_mode)) {
|
if (tbInfo->hlInfo == NULL && S_ISREG(statbuf->st_mode)) {
|
||||||
/* 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 */
|
||||||
|
|
Loading…
Reference in New Issue