Detect file index even when giant blocks are present earlier

pull/16/head
Dave Vasilevsky 12 years ago
parent aa5206b42b
commit fb8bc15f43

@ -78,7 +78,7 @@ static void rbuf_dispatch(void);
static bool read_header(lzma_check *check);
static bool read_block(bool force_stream, lzma_check check);
static void read_streaming(lzma_block *block);
static void read_streaming(lzma_block *block, block_type sized);
static void read_index(void);
static void read_footer(void);
@ -178,7 +178,7 @@ void pixz_read(bool verify, size_t nspecs, char **specs) {
tar = taste_tar(ib);
start = false;
}
if (ib->btype != BLOCK_SIZED)
if (ib->btype == BLOCK_UNSIZED)
all_sized = false;
if (!skipping)
@ -379,10 +379,9 @@ static bool read_block(bool force_stream, lzma_check check) {
die("Error decoding block header");
size_t comp = block.compressed_size, outsize = block.uncompressed_size;
if (force_stream || comp == LZMA_VLI_UNKNOWN
|| outsize == LZMA_VLI_UNKNOWN
|| outsize > MAXSPLITSIZE) {
read_streaming(&block);
bool sized = (comp != LZMA_VLI_UNKNOWN && outsize != LZMA_VLI_UNKNOWN);
if (force_stream || !sized || outsize > MAXSPLITSIZE) {
read_streaming(&block, sized ? BLOCK_SIZED : BLOCK_UNSIZED);
} else {
block_capacity(gRbuf, 0, outsize);
gRbuf->outsize = outsize;
@ -396,7 +395,7 @@ static bool read_block(bool force_stream, lzma_check check) {
return true;
}
static void read_streaming(lzma_block *block) {
static void read_streaming(lzma_block *block, block_type sized) {
lzma_stream stream = LZMA_STREAM_INIT;
if (lzma_block_decoder(&stream, block) != LZMA_OK)
die("Error initializing streaming block decode");
@ -420,7 +419,7 @@ static void read_streaming(lzma_block *block) {
}
queue_pop(gPipelineStartQ, (void**)&pi);
ib = (io_block_t*)pi->data;
ib->btype = (first ? BLOCK_UNSIZED : BLOCK_CONTINUATION);
ib->btype = (first ? sized : BLOCK_CONTINUATION);
block_capacity(ib, 0, STREAMSIZE);
stream.next_out = ib->output;
stream.avail_out = ib->outcap;

Loading…
Cancel
Save