mirror of
https://github.com/sheumann/hush.git
synced 2024-12-28 07:30:23 +00:00
tar: cry murder and bail out if file shrinks under us while we tar it up
This commit is contained in:
parent
0b35470d9b
commit
4fbb584a0e
@ -59,7 +59,7 @@ struct TarHeader { /* byte offset */
|
||||
typedef struct TarHeader TarHeader;
|
||||
|
||||
/*
|
||||
** writeTarFile(), writeFileToTarball(), and writeTarHeader() are
|
||||
** writeTarFile(), writeFileToTarball(), and writeTarHeader() are
|
||||
** the only functions that deal with the HardLinkInfo structure.
|
||||
** Even these functions use the xxxHardLinkInfo() functions.
|
||||
*/
|
||||
@ -397,7 +397,17 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf,
|
||||
off_t readSize = 0;
|
||||
|
||||
/* write the file to the archive */
|
||||
readSize = bb_copyfd_eof(inputFileFd, tbInfo->tarFd);
|
||||
readSize = bb_copyfd_size(inputFileFd, tbInfo->tarFd, statbuf->st_size);
|
||||
if (readSize != statbuf->st_size) {
|
||||
/* Deadly. We record size into header first, */
|
||||
/* and then write out file. If file shrinks in between, */
|
||||
/* tar will be corrupted. So bail out. */
|
||||
/* NB: GNU tar 1.16 warns and pads with zeroes */
|
||||
/* or even seeks back and updates header */
|
||||
bb_error_msg_and_die("short read from %s", fileName);
|
||||
}
|
||||
/* Check that file did not grow in between? */
|
||||
/* if (safe_read(inputFileFd,1) == 1) warn but continue? */
|
||||
close(inputFileFd);
|
||||
|
||||
/* Pad the file up to the tar block size */
|
||||
|
@ -46,8 +46,7 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
|
||||
} else if (rd < 0) {
|
||||
bb_perror_msg(bb_msg_read_error);
|
||||
break;
|
||||
} else if (rd == 0) {
|
||||
/* All done. */
|
||||
} else { /* eof - all done. */
|
||||
status = 0;
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user