← Commit list

e569553aa

Rob Landley
Rob Landley
2006-01-09
SOURCE BUG Duration: 14s

Subject

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.

SOURCE BUG

This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)

→ Bu hatanin tam hikayesini ve duzeltme diffini gor

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

archival/tar.c+14 -11
@@ -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);