aboutsummaryrefslogtreecommitdiff
path: root/archival/libunarchive
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2006-12-22 00:21:07 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2006-12-22 00:21:07 +0000
commit714701c890b5f03253c5ecdb7367c4258ce78715 (patch)
tree7ddaf73cf2deda0f357b21802dab4d42798dd778 /archival/libunarchive
parent0a8a7741795880201bcf78231d1eab0e2538bb0b (diff)
downloadbusybox-w32-714701c890b5f03253c5ecdb7367c4258ce78715.tar.gz
busybox-w32-714701c890b5f03253c5ecdb7367c4258ce78715.tar.bz2
busybox-w32-714701c890b5f03253c5ecdb7367c4258ce78715.zip
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)
Diffstat (limited to 'archival/libunarchive')
-rw-r--r--archival/libunarchive/data_extract_all.c4
-rw-r--r--archival/libunarchive/data_extract_to_buffer.c3
-rw-r--r--archival/libunarchive/data_extract_to_stdout.c6
-rw-r--r--archival/libunarchive/get_header_ar.c3
-rw-r--r--archival/libunarchive/get_header_tar.c2
-rw-r--r--archival/libunarchive/seek_by_read.c5
6 files changed, 12 insertions, 11 deletions
diff --git a/archival/libunarchive/data_extract_all.c b/archival/libunarchive/data_extract_all.c
index 67f8f3534..25bf028d2 100644
--- a/archival/libunarchive/data_extract_all.c
+++ b/archival/libunarchive/data_extract_all.c
@@ -67,10 +67,10 @@ void data_extract_all(archive_handle_t *archive_handle)
67 /* Regular file */ 67 /* Regular file */
68 dst_fd = xopen3(file_header->name, O_WRONLY | O_CREAT | O_EXCL, 68 dst_fd = xopen3(file_header->name, O_WRONLY | O_CREAT | O_EXCL,
69 file_header->mode); 69 file_header->mode);
70 bb_copyfd_size(archive_handle->src_fd, dst_fd, file_header->size); 70 bb_copyfd_exact_size(archive_handle->src_fd, dst_fd, file_header->size);
71 close(dst_fd); 71 close(dst_fd);
72 break; 72 break;
73 } 73 }
74 case S_IFDIR: 74 case S_IFDIR:
75 res = mkdir(file_header->name, file_header->mode); 75 res = mkdir(file_header->name, file_header->mode);
76 if ((errno != EISDIR) && (res == -1) 76 if ((errno != EISDIR) && (res == -1)
diff --git a/archival/libunarchive/data_extract_to_buffer.c b/archival/libunarchive/data_extract_to_buffer.c
index 95cb8f576..d8fcdf3d3 100644
--- a/archival/libunarchive/data_extract_to_buffer.c
+++ b/archival/libunarchive/data_extract_to_buffer.c
@@ -10,9 +10,8 @@
10 10
11void data_extract_to_buffer(archive_handle_t *archive_handle) 11void data_extract_to_buffer(archive_handle_t *archive_handle)
12{ 12{
13 const unsigned int size = archive_handle->file_header->size; 13 unsigned int size = archive_handle->file_header->size;
14 14
15 archive_handle->buffer = xzalloc(size + 1); 15 archive_handle->buffer = xzalloc(size + 1);
16
17 xread(archive_handle->src_fd, archive_handle->buffer, size); 16 xread(archive_handle->src_fd, archive_handle->buffer, size);
18} 17}
diff --git a/archival/libunarchive/data_extract_to_stdout.c b/archival/libunarchive/data_extract_to_stdout.c
index 788246ce7..2e266c046 100644
--- a/archival/libunarchive/data_extract_to_stdout.c
+++ b/archival/libunarchive/data_extract_to_stdout.c
@@ -4,9 +4,11 @@
4 */ 4 */
5 5
6#include "unarchive.h" 6#include "unarchive.h"
7#include <unistd.h> 7//#include <unistd.h>
8 8
9void data_extract_to_stdout(archive_handle_t *archive_handle) 9void data_extract_to_stdout(archive_handle_t *archive_handle)
10{ 10{
11 bb_copyfd_size(archive_handle->src_fd, STDOUT_FILENO, archive_handle->file_header->size); 11 bb_copyfd_exact_size(archive_handle->src_fd,
12 STDOUT_FILENO,
13 archive_handle->file_header->size);
12} 14}
diff --git a/archival/libunarchive/get_header_ar.c b/archival/libunarchive/get_header_ar.c
index 7f8c81ca0..6638c65aa 100644
--- a/archival/libunarchive/get_header_ar.c
+++ b/archival/libunarchive/get_header_ar.c
@@ -96,7 +96,8 @@ char get_header_ar(archive_handle_t *archive_handle)
96 if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { 96 if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {
97 archive_handle->action_header(typed); 97 archive_handle->action_header(typed);
98 if (archive_handle->sub_archive) { 98 if (archive_handle->sub_archive) {
99 while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS); 99 while (archive_handle->action_data_subarchive(archive_handle->sub_archive) == EXIT_SUCCESS)
100 /* repeat */;
100 } else { 101 } else {
101 archive_handle->action_data(archive_handle); 102 archive_handle->action_data(archive_handle);
102 } 103 }
diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c
index 66c3314a1..beb8687c7 100644
--- a/archival/libunarchive/get_header_tar.c
+++ b/archival/libunarchive/get_header_tar.c
@@ -251,7 +251,7 @@ char get_header_tar(archive_handle_t *archive_handle)
251 } 251 }
252 252
253 /* Strip trailing '/' in directories */ 253 /* Strip trailing '/' in directories */
254 /* Must be done after mode is set as '/' is used to check if its a directory */ 254 /* Must be done after mode is set as '/' is used to check if it's a directory */
255 cp = last_char_is(file_header->name, '/'); 255 cp = last_char_is(file_header->name, '/');
256 256
257 if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) { 257 if (archive_handle->filter(archive_handle) == EXIT_SUCCESS) {
diff --git a/archival/libunarchive/seek_by_read.c b/archival/libunarchive/seek_by_read.c
index d56f94b21..e46af4842 100644
--- a/archival/libunarchive/seek_by_read.c
+++ b/archival/libunarchive/seek_by_read.c
@@ -13,7 +13,6 @@
13 */ 13 */
14void seek_by_read(const archive_handle_t *archive_handle, const unsigned int jump_size) 14void seek_by_read(const archive_handle_t *archive_handle, const unsigned int jump_size)
15{ 15{
16 if (jump_size) { 16 if (jump_size)
17 bb_copyfd_size(archive_handle->src_fd, -1, jump_size); 17 bb_copyfd_exact_size(archive_handle->src_fd, -1, jump_size);
18 }
19} 18}