tar et al: die if bb_copyfd_size copies less than asked for.

(we have bb_copyfd_exact_size now for that kind of usage)
This commit is contained in:
Denis Vlasenko
2006-12-22 00:21:07 +00:00
parent 0a8a774179
commit 714701c890
13 changed files with 84 additions and 65 deletions

View File

@@ -67,10 +67,10 @@ void data_extract_all(archive_handle_t *archive_handle)
/* Regular file */
dst_fd = xopen3(file_header->name, O_WRONLY | O_CREAT | O_EXCL,
file_header->mode);
bb_copyfd_size(archive_handle->src_fd, dst_fd, file_header->size);
bb_copyfd_exact_size(archive_handle->src_fd, dst_fd, file_header->size);
close(dst_fd);
break;
}
}
case S_IFDIR:
res = mkdir(file_header->name, file_header->mode);
if ((errno != EISDIR) && (res == -1)

View File

@@ -10,9 +10,8 @@
void data_extract_to_buffer(archive_handle_t *archive_handle)
{
const unsigned int size = archive_handle->file_header->size;
unsigned int size = archive_handle->file_header->size;
archive_handle->buffer = xzalloc(size + 1);
xread(archive_handle->src_fd, archive_handle->buffer, size);
}

View File

@@ -4,9 +4,11 @@
*/
#include "unarchive.h"
#include <unistd.h>
//#include <unistd.h>
void data_extract_to_stdout(archive_handle_t *archive_handle)
{
bb_copyfd_size(archive_handle->src_fd, STDOUT_FILENO, archive_handle->file_header->size);
bb_copyfd_exact_size(archive_handle->src_fd,
STDOUT_FILENO,
archive_handle->file_header->size);
}

View File

@@ -96,7 +96,8 @@ char get_header_ar(archive_handle_t *archive_handle)
if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {
archive_handle->action_header(typed);
if (archive_handle->sub_archive) {
while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS);
while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS)
/* repeat */;
} else {
archive_handle->action_data(archive_handle);
}

View File

@@ -251,7 +251,7 @@ char get_header_tar(archive_handle_t *archive_handle)
}
/* Strip trailing '/' in directories */
/* Must be done after mode is set as '/' is used to check if its a directory */
/* Must be done after mode is set as '/' is used to check if it's a directory */
cp = last_char_is(file_header->name, '/');
if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {

View File

@@ -13,7 +13,6 @@
*/
void seek_by_read(const archive_handle_t *archive_handle, const unsigned int jump_size)
{
if (jump_size) {
bb_copyfd_size(archive_handle->src_fd, -1, jump_size);
}
if (jump_size)
bb_copyfd_exact_size(archive_handle->src_fd, -1, jump_size);
}