diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-24 14:55:23 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-24 14:55:23 +0000 |
commit | 4fbb584a0e6ee086d6b30936c7124c687b3e977f (patch) | |
tree | 279f3ff5c1a47d36ad4eec248240f11c7ef8d438 | |
parent | 0b35470d9b5e75a7a1df2e6860b48831e7920353 (diff) | |
download | busybox-w32-4fbb584a0e6ee086d6b30936c7124c687b3e977f.tar.gz busybox-w32-4fbb584a0e6ee086d6b30936c7124c687b3e977f.tar.bz2 busybox-w32-4fbb584a0e6ee086d6b30936c7124c687b3e977f.zip |
tar: cry murder and bail out if file shrinks under us while we tar it up
-rw-r--r-- | archival/tar.c | 14 | ||||
-rw-r--r-- | libbb/copyfd.c | 3 |
2 files changed, 13 insertions, 4 deletions
diff --git a/archival/tar.c b/archival/tar.c index 6aaa42273..99c4adb6a 100644 --- a/archival/tar.c +++ b/archival/tar.c | |||
@@ -59,7 +59,7 @@ struct TarHeader { /* byte offset */ | |||
59 | typedef struct TarHeader TarHeader; | 59 | typedef struct TarHeader TarHeader; |
60 | 60 | ||
61 | /* | 61 | /* |
62 | ** writeTarFile(), writeFileToTarball(), and writeTarHeader() are | 62 | ** writeTarFile(), writeFileToTarball(), and writeTarHeader() are |
63 | ** the only functions that deal with the HardLinkInfo structure. | 63 | ** the only functions that deal with the HardLinkInfo structure. |
64 | ** Even these functions use the xxxHardLinkInfo() functions. | 64 | ** Even these functions use the xxxHardLinkInfo() functions. |
65 | */ | 65 | */ |
@@ -397,7 +397,17 @@ static int writeFileToTarball(const char *fileName, struct stat *statbuf, | |||
397 | off_t readSize = 0; | 397 | off_t readSize = 0; |
398 | 398 | ||
399 | /* write the file to the archive */ | 399 | /* write the file to the archive */ |
400 | readSize = bb_copyfd_eof(inputFileFd, tbInfo->tarFd); | 400 | readSize = bb_copyfd_size(inputFileFd, tbInfo->tarFd, statbuf->st_size); |
401 | if (readSize != statbuf->st_size) { | ||
402 | /* Deadly. We record size into header first, */ | ||
403 | /* and then write out file. If file shrinks in between, */ | ||
404 | /* tar will be corrupted. So bail out. */ | ||
405 | /* NB: GNU tar 1.16 warns and pads with zeroes */ | ||
406 | /* or even seeks back and updates header */ | ||
407 | bb_error_msg_and_die("short read from %s", fileName); | ||
408 | } | ||
409 | /* Check that file did not grow in between? */ | ||
410 | /* if (safe_read(inputFileFd,1) == 1) warn but continue? */ | ||
401 | close(inputFileFd); | 411 | close(inputFileFd); |
402 | 412 | ||
403 | /* Pad the file up to the tar block size */ | 413 | /* Pad the file up to the tar block size */ |
diff --git a/libbb/copyfd.c b/libbb/copyfd.c index 87126eb72..601c51ce4 100644 --- a/libbb/copyfd.c +++ b/libbb/copyfd.c | |||
@@ -46,8 +46,7 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size) | |||
46 | } else if (rd < 0) { | 46 | } else if (rd < 0) { |
47 | bb_perror_msg(bb_msg_read_error); | 47 | bb_perror_msg(bb_msg_read_error); |
48 | break; | 48 | break; |
49 | } else if (rd == 0) { | 49 | } else { /* eof - all done. */ |
50 | /* All done. */ | ||
51 | status = 0; | 50 | status = 0; |
52 | break; | 51 | break; |
53 | } | 52 | } |