summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Landley2006-01-09 03:07:44 +0000
committerRob Landley2006-01-09 03:07:44 +0000
commite569553aa0e510117b2b671e036a9de62cde91c9 (patch)
tree213b2aaeea588afe1e1116f01803524765232538
parent3d1bbf0a5fb02e5336b29ca7ba53e7fc3be958d7 (diff)
downloadbusybox-e569553aa0e510117b2b671e036a9de62cde91c9.zip
busybox-e569553aa0e510117b2b671e036a9de62cde91c9.tar.gz
Bug 547: writing out the tar file header before we confirm we can actually
open and read from the file isn't something we can recover from after the fact. Resequence things to check first, write second.
-rw-r--r--archival/tar.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/archival/tar.c b/archival/tar.c
index cd89a75..d5fa954 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -331,6 +331,7 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
{
struct TarBallInfo *tbInfo = (struct TarBallInfo *) userData;
const char *header_name;
+ int inputFileFd = -1;
/*
** Check to see if we are dealing with a hard link.
@@ -385,30 +386,32 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
return SKIP;
}
- if (writeTarHeader(tbInfo, header_name, fileName, statbuf) == FALSE) {
- return (FALSE);
- }
-
- /* Now, if the file is a regular file, copy it out to the tarball */
- if ((tbInfo->hlInfo == NULL)
- && (S_ISREG(statbuf->st_mode))) {
- int inputFileFd;
- ssize_t readSize = 0;
+ /* 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 */
if ((inputFileFd = open(fileName, O_RDONLY)) < 0) {
bb_perror_msg("%s: Cannot open", fileName);
return (FALSE);
}
+ }
+
+ /* Add an entry to the tarball */
+ if (writeTarHeader(tbInfo, header_name, fileName, statbuf) == FALSE) {
+ return (FALSE);
+ }
+
+ /* If it was a regular file, write out the body */
+ if (inputFileFd >= 0 ) {
+ ssize_t readSize = 0;
/* write the file to the archive */
readSize = bb_copyfd_eof(inputFileFd, tbInfo->tarFd);
+ close(inputFileFd);
/* Pad the file up to the tar block size */
for (; (readSize % TAR_BLOCK_SIZE) != 0; readSize++)
write(tbInfo->tarFd, "\0", 1);
-
- close(inputFileFd);
}
return (TRUE);