diff --git a/archival/tar.c b/archival/tar.c index 11f5ebac0..bbda52d14 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -386,35 +386,6 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, const char *header_name; 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; while (header_name[0] == '/') { static smallint warned; @@ -426,19 +397,49 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, 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 (strlen(fileName) >= NAME_SIZE) { + if (strlen(header_name) >= NAME_SIZE) { bb_error_msg("names longer than "NAME_SIZE_STR" chars not supported"); return TRUE; } #endif - if (header_name[0] == '\0') - return TRUE; - - if (exclude_file(tbInfo->excludeList, header_name)) - return SKIP; - /* Is this a regular file? */ if (tbInfo->hlInfo == NULL && S_ISREG(statbuf->st_mode)) { /* open the file we want to archive, and make sure all is well */