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 bytes
diff --git a/archival/tar.c b/archival/tar.c
index 11f5eba..bbda52d 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -386,35 +386,6 @@
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 @@
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 */