dpkg-deb: work around bogus error message when working with XZ compressed packages
function old new delta unpack_xz_stream 2309 2317 +8 bb_full_fd_action 464 472 +8 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7011eca83a
commit
42f454b13b
@ -96,6 +96,24 @@ unpack_xz_stream(transformer_state_t *xstate)
|
|||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
if (membuf[iobuf.in_pos] != 0) {
|
if (membuf[iobuf.in_pos] != 0) {
|
||||||
|
/* There is more data, but is it XZ data?
|
||||||
|
* Example: dpkg-deb -f busybox_1.30.1-4_amd64.deb
|
||||||
|
* reads control.tar.xz "control" file
|
||||||
|
* inside the ar archive, but tar.xz
|
||||||
|
* extraction code reaches end of xz data,
|
||||||
|
* reached this code and reads the beginning
|
||||||
|
* of data.tar.xz's ar header, which isn't xz data,
|
||||||
|
* and prints "corrupted data".
|
||||||
|
* The correct solution is to not read
|
||||||
|
* past nested archive (to simulate EOF).
|
||||||
|
* This is a workaround:
|
||||||
|
*/
|
||||||
|
if (membuf[iobuf.in_pos] != 0xfd) {
|
||||||
|
/* It's definitely not a xz signature
|
||||||
|
* (which is 0xfd,"7zXZ",0x00).
|
||||||
|
*/
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
xz_dec_reset(state);
|
xz_dec_reset(state);
|
||||||
goto do_run;
|
goto do_run;
|
||||||
}
|
}
|
||||||
@ -128,7 +146,7 @@ unpack_xz_stream(transformer_state_t *xstate)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
end:
|
||||||
xz_dec_end(state);
|
xz_dec_end(state);
|
||||||
free(membuf);
|
free(membuf);
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#define STREAM_HEADER_SIZE 12
|
#define STREAM_HEADER_SIZE 12
|
||||||
|
|
||||||
#define HEADER_MAGIC "\3757zXZ"
|
#define HEADER_MAGIC "\375""7zXZ"
|
||||||
#define HEADER_MAGIC_SIZE 6
|
#define HEADER_MAGIC_SIZE 6
|
||||||
|
|
||||||
#define FOOTER_MAGIC "YZ"
|
#define FOOTER_MAGIC "YZ"
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
* was seen to cause largish delays when user tries to ^C a file copy.
|
* was seen to cause largish delays when user tries to ^C a file copy.
|
||||||
* Let's use a saner size.
|
* Let's use a saner size.
|
||||||
* Note: needs to be >= max(CONFIG_FEATURE_COPYBUF_KB),
|
* Note: needs to be >= max(CONFIG_FEATURE_COPYBUF_KB),
|
||||||
* or else "copy to eof" code will use neddlesly short reads.
|
* or else "copy to eof" code will use needlesly short reads.
|
||||||
*/
|
*/
|
||||||
#define SENDFILE_BIGBUF (16*1024*1024)
|
#define SENDFILE_BIGBUF (16*1024*1024)
|
||||||
|
|
||||||
@ -60,10 +60,13 @@ static off_t bb_full_fd_action(int src_fd, int dst_fd, off_t size)
|
|||||||
ssize_t rd;
|
ssize_t rd;
|
||||||
|
|
||||||
if (sendfile_sz) {
|
if (sendfile_sz) {
|
||||||
rd = sendfile(dst_fd, src_fd, NULL,
|
/* dst_fd == -1 is a fake, else... */
|
||||||
size > sendfile_sz ? sendfile_sz : size);
|
if (dst_fd >= 0) {
|
||||||
if (rd >= 0)
|
rd = sendfile(dst_fd, src_fd, NULL,
|
||||||
goto read_ok;
|
size > sendfile_sz ? sendfile_sz : size);
|
||||||
|
if (rd >= 0)
|
||||||
|
goto read_ok;
|
||||||
|
}
|
||||||
sendfile_sz = 0; /* do not try sendfile anymore */
|
sendfile_sz = 0; /* do not try sendfile anymore */
|
||||||
}
|
}
|
||||||
#if CONFIG_FEATURE_COPYBUF_KB > 4
|
#if CONFIG_FEATURE_COPYBUF_KB > 4
|
||||||
|
Loading…
x
Reference in New Issue
Block a user