1/*-
2 * Copyright (c) 2014 Michihiro NAKAJIMA
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "archive_platform.h"
27
28#ifdef HAVE_ERRNO_H
29#include <errno.h>
30#endif
31#include <stdio.h>
32#ifdef HAVE_STDLIB_H
33#include <stdlib.h>
34#endif
35#ifdef HAVE_STRING_H
36#include <string.h>
37#endif
38#ifdef HAVE_UNISTD_H
39#include <unistd.h>
40#endif
41#ifdef HAVE_LZ4_H
42#include <lz4.h>
43#endif
44
45#include "archive.h"
46#include "archive_endian.h"
47#include "archive_private.h"
48#include "archive_read_private.h"
49#include "archive_xxhash.h"
50
51#define LZ4_MAGICNUMBER		0x184d2204
52#define LZ4_SKIPPABLED		0x184d2a50
53#define LZ4_LEGACY		0x184c2102
54
55#if defined(HAVE_LIBLZ4)
56struct private_data {
57	enum {  SELECT_STREAM,
58		READ_DEFAULT_STREAM,
59		READ_DEFAULT_BLOCK,
60		READ_LEGACY_STREAM,
61		READ_LEGACY_BLOCK,
62	}		stage;
63	struct {
64		unsigned block_independence:1;
65		unsigned block_checksum:3;
66		unsigned stream_size:1;
67		unsigned stream_checksum:1;
68		unsigned preset_dictionary:1;
69		int	 block_maximum_size;
70	} flags;
71	int64_t		 stream_size;
72	uint32_t	 dict_id;
73	char		*out_block;
74	size_t		 out_block_size;
75
76	/* Bytes read but not yet consumed via __archive_read_consume() */
77	size_t		 unconsumed;
78	size_t		 decoded_size;
79	void		*xxh32_state;
80
81	char		 valid; /* True = decompressor is initialized */
82	char		 eof; /* True = found end of compressed data. */
83};
84
85#define LEGACY_BLOCK_SIZE	(8 * 1024 * 1024)
86
87/* Lz4 filter */
88static ssize_t	lz4_filter_read(struct archive_read_filter *, const void **);
89static int	lz4_filter_close(struct archive_read_filter *);
90#endif
91
92/*
93 * Note that we can detect lz4 archives even if we can't decompress
94 * them.  (In fact, we like detecting them because we can give better
95 * error messages.)  So the bid framework here gets compiled even
96 * if liblz4 is unavailable.
97 */
98static int	lz4_reader_bid(struct archive_read_filter_bidder *, struct archive_read_filter *);
99static int	lz4_reader_init(struct archive_read_filter *);
100#if defined(HAVE_LIBLZ4)
101static ssize_t  lz4_filter_read_default_stream(struct archive_read_filter *,
102		    const void **);
103static ssize_t  lz4_filter_read_legacy_stream(struct archive_read_filter *,
104		    const void **);
105#endif
106
107static const struct archive_read_filter_bidder_vtable
108lz4_bidder_vtable = {
109	.bid = lz4_reader_bid,
110	.init = lz4_reader_init,
111};
112
113int
114archive_read_support_filter_lz4(struct archive *_a)
115{
116	struct archive_read *a = (struct archive_read *)_a;
117
118	if (__archive_read_register_bidder(a, NULL, "lz4",
119				&lz4_bidder_vtable) != ARCHIVE_OK)
120		return (ARCHIVE_FATAL);
121
122#if defined(HAVE_LIBLZ4)
123	return (ARCHIVE_OK);
124#else
125	archive_set_error(_a, ARCHIVE_ERRNO_MISC,
126	    "Using external lz4 program");
127	return (ARCHIVE_WARN);
128#endif
129}
130
131/*
132 * Test whether we can handle this data.
133 *
134 * This logic returns zero if any part of the signature fails.  It
135 * also tries to Do The Right Thing if a very short buffer prevents us
136 * from verifying as much as we would like.
137 */
138static int
139lz4_reader_bid(struct archive_read_filter_bidder *self,
140    struct archive_read_filter *filter)
141{
142	const unsigned char *buffer;
143	ssize_t avail;
144	int bits_checked;
145	uint32_t number;
146
147	(void)self; /* UNUSED */
148
149	/* Minimal lz4 archive is 11 bytes. */
150	buffer = __archive_read_filter_ahead(filter, 11, &avail);
151	if (buffer == NULL)
152		return (0);
153
154	/* First four bytes must be LZ4 magic numbers. */
155	bits_checked = 0;
156	if ((number = archive_le32dec(buffer)) == LZ4_MAGICNUMBER) {
157		unsigned char flag, BD;
158
159		bits_checked += 32;
160		/* Next follows a stream descriptor. */
161		/* Descriptor Flags. */
162		flag = buffer[4];
163		/* A version number must be "01". */
164		if (((flag & 0xc0) >> 6) != 1)
165			return (0);
166		/* A reserved bit must be "0". */
167		if (flag & 2)
168			return (0);
169		bits_checked += 8;
170		BD = buffer[5];
171		/* A block maximum size should be more than 3. */
172		if (((BD & 0x70) >> 4) < 4)
173			return (0);
174		/* Reserved bits must be "0". */
175		if (BD & ~0x70)
176			return (0);
177		bits_checked += 8;
178	} else if (number == LZ4_LEGACY) {
179		bits_checked += 32;
180	}
181
182	return (bits_checked);
183}
184
185#if !defined(HAVE_LIBLZ4)
186
187/*
188 * If we don't have the library on this system, we can't actually do the
189 * decompression.  We can, however, still detect compressed archives
190 * and emit a useful message.
191 */
192static int
193lz4_reader_init(struct archive_read_filter *self)
194{
195	int r;
196
197	r = __archive_read_program(self, "lz4 -d -q");
198	/* Note: We set the format here even if __archive_read_program()
199	 * above fails.  We do, after all, know what the format is
200	 * even if we weren't able to read it. */
201	self->code = ARCHIVE_FILTER_LZ4;
202	self->name = "lz4";
203	return (r);
204}
205
206
207#else
208
209static const struct archive_read_filter_vtable
210lz4_reader_vtable = {
211	.read = lz4_filter_read,
212	.close = lz4_filter_close,
213};
214
215/*
216 * Setup the callbacks.
217 */
218static int
219lz4_reader_init(struct archive_read_filter *self)
220{
221	struct private_data *state;
222
223	self->code = ARCHIVE_FILTER_LZ4;
224	self->name = "lz4";
225
226	state = (struct private_data *)calloc(1, sizeof(*state));
227	if (state == NULL) {
228		archive_set_error(&self->archive->archive, ENOMEM,
229		    "Can't allocate data for lz4 decompression");
230		return (ARCHIVE_FATAL);
231	}
232
233	self->data = state;
234	state->stage = SELECT_STREAM;
235	self->vtable = &lz4_reader_vtable;
236
237	return (ARCHIVE_OK);
238}
239
240static int
241lz4_allocate_out_block(struct archive_read_filter *self)
242{
243	struct private_data *state = (struct private_data *)self->data;
244	size_t out_block_size = state->flags.block_maximum_size;
245	void *out_block;
246
247	if (!state->flags.block_independence)
248		out_block_size += 64 * 1024;
249	if (state->out_block_size < out_block_size) {
250		free(state->out_block);
251		out_block = (unsigned char *)malloc(out_block_size);
252		state->out_block_size = out_block_size;
253		if (out_block == NULL) {
254			archive_set_error(&self->archive->archive, ENOMEM,
255			    "Can't allocate data for lz4 decompression");
256			return (ARCHIVE_FATAL);
257		}
258		state->out_block = out_block;
259	}
260	if (!state->flags.block_independence)
261		memset(state->out_block, 0, 64 * 1024);
262	return (ARCHIVE_OK);
263}
264
265static int
266lz4_allocate_out_block_for_legacy(struct archive_read_filter *self)
267{
268	struct private_data *state = (struct private_data *)self->data;
269	size_t out_block_size = LEGACY_BLOCK_SIZE;
270	void *out_block;
271
272	if (state->out_block_size < out_block_size) {
273		free(state->out_block);
274		out_block = (unsigned char *)malloc(out_block_size);
275		state->out_block_size = out_block_size;
276		if (out_block == NULL) {
277			archive_set_error(&self->archive->archive, ENOMEM,
278			    "Can't allocate data for lz4 decompression");
279			return (ARCHIVE_FATAL);
280		}
281		state->out_block = out_block;
282	}
283	return (ARCHIVE_OK);
284}
285
286/*
287 * Return the next block of decompressed data.
288 */
289static ssize_t
290lz4_filter_read(struct archive_read_filter *self, const void **p)
291{
292	struct private_data *state = (struct private_data *)self->data;
293	ssize_t ret;
294
295	if (state->eof) {
296		*p = NULL;
297		return (0);
298	}
299
300	__archive_read_filter_consume(self->upstream, state->unconsumed);
301	state->unconsumed = 0;
302
303	switch (state->stage) {
304	case SELECT_STREAM:
305		break;
306	case READ_DEFAULT_STREAM:
307	case READ_LEGACY_STREAM:
308		/* Reading a lz4 stream already failed. */
309		archive_set_error(&self->archive->archive,
310		    ARCHIVE_ERRNO_MISC, "Invalid sequence.");
311		return (ARCHIVE_FATAL);
312	case READ_DEFAULT_BLOCK:
313		ret = lz4_filter_read_default_stream(self, p);
314		if (ret != 0 || state->stage != SELECT_STREAM)
315			return ret;
316		break;
317	case READ_LEGACY_BLOCK:
318		ret = lz4_filter_read_legacy_stream(self, p);
319		if (ret != 0 || state->stage != SELECT_STREAM)
320			return ret;
321		break;
322	default:
323		archive_set_error(&self->archive->archive,
324		    ARCHIVE_ERRNO_MISC, "Program error.");
325		return (ARCHIVE_FATAL);
326		break;
327	}
328
329	while (state->stage == SELECT_STREAM) {
330		const char *read_buf;
331
332		/* Read a magic number. */
333		read_buf = __archive_read_filter_ahead(self->upstream, 4,
334				NULL);
335		if (read_buf == NULL) {
336			state->eof = 1;
337			*p = NULL;
338			return (0);
339		}
340		uint32_t number = archive_le32dec(read_buf);
341		__archive_read_filter_consume(self->upstream, 4);
342		if (number == LZ4_MAGICNUMBER)
343			return lz4_filter_read_default_stream(self, p);
344		else if (number == LZ4_LEGACY)
345			return lz4_filter_read_legacy_stream(self, p);
346		else if ((number & ~0xF) == LZ4_SKIPPABLED) {
347			read_buf = __archive_read_filter_ahead(
348				self->upstream, 4, NULL);
349			if (read_buf == NULL) {
350				archive_set_error(
351				    &self->archive->archive,
352		    		    ARCHIVE_ERRNO_MISC,
353				    "Malformed lz4 data");
354				return (ARCHIVE_FATAL);
355			}
356			uint32_t skip_bytes = archive_le32dec(read_buf);
357			__archive_read_filter_consume(self->upstream,
358				4 + skip_bytes);
359		} else {
360			/* Ignore following unrecognized data. */
361			state->eof = 1;
362			*p = NULL;
363			return (0);
364		}
365	}
366	state->eof = 1;
367	*p = NULL;
368	return (0);
369}
370
371static int
372lz4_filter_read_descriptor(struct archive_read_filter *self)
373{
374	struct private_data *state = (struct private_data *)self->data;
375	const char *read_buf;
376	ssize_t bytes_remaining;
377	ssize_t descriptor_bytes;
378	unsigned char flag, bd;
379	unsigned int chsum, chsum_verifier;
380
381	/* Make sure we have 2 bytes for flags. */
382	read_buf = __archive_read_filter_ahead(self->upstream, 2,
383	    &bytes_remaining);
384	if (read_buf == NULL) {
385		archive_set_error(&self->archive->archive,
386		    ARCHIVE_ERRNO_MISC,
387		    "truncated lz4 input");
388		return (ARCHIVE_FATAL);
389	}
390
391	/*
392	   Parse flags.
393	 */
394	flag = (unsigned char)read_buf[0];
395	/* Verify version number. */
396	if ((flag & 0xc0) != 1<<6)
397		goto malformed_error;
398	/* A reserved bit must be zero. */
399	if (flag & 0x02)
400		goto malformed_error;
401	state->flags.block_independence = (flag & 0x20) != 0;
402	state->flags.block_checksum = (flag & 0x10)?4:0;
403	state->flags.stream_size = (flag & 0x08) != 0;
404	state->flags.stream_checksum = (flag & 0x04) != 0;
405	state->flags.preset_dictionary = (flag & 0x01) != 0;
406
407	/* BD */
408	bd = (unsigned char)read_buf[1];
409	/* Reserved bits must be zero. */
410	if (bd & 0x8f)
411		goto malformed_error;
412	/* Get a maximum block size. */
413	switch (read_buf[1] >> 4) {
414	case 4: /* 64 KB */
415		state->flags.block_maximum_size = 64 * 1024;
416		break;
417	case 5: /* 256 KB */
418		state->flags.block_maximum_size = 256 * 1024;
419		break;
420	case 6: /* 1 MB */
421		state->flags.block_maximum_size = 1024 * 1024;
422		break;
423	case 7: /* 4 MB */
424		state->flags.block_maximum_size = 4 * 1024 * 1024;
425		break;
426	default:
427		goto malformed_error;
428	}
429
430	/* Read the whole descriptor in a stream block. */
431	descriptor_bytes = 3;
432	if (state->flags.stream_size)
433		descriptor_bytes += 8;
434	if (state->flags.preset_dictionary)
435		descriptor_bytes += 4;
436	if (bytes_remaining < descriptor_bytes) {
437		read_buf = __archive_read_filter_ahead(self->upstream,
438		    descriptor_bytes, &bytes_remaining);
439		if (read_buf == NULL) {
440			archive_set_error(&self->archive->archive,
441			    ARCHIVE_ERRNO_MISC,
442			    "truncated lz4 input");
443			return (ARCHIVE_FATAL);
444		}
445	}
446	/* Check if a descriptor is corrupted */
447	chsum = __archive_xxhash.XXH32(read_buf, (int)descriptor_bytes -1, 0);
448	chsum = (chsum >> 8) & 0xff;
449	chsum_verifier = read_buf[descriptor_bytes-1] & 0xff;
450#ifndef DONT_FAIL_ON_CRC_ERROR
451	if (chsum != chsum_verifier)
452		goto malformed_error;
453#endif
454
455	__archive_read_filter_consume(self->upstream, descriptor_bytes);
456
457	/* Make sure we have a large enough buffer for uncompressed data. */
458	if (lz4_allocate_out_block(self) != ARCHIVE_OK)
459		return (ARCHIVE_FATAL);
460	if (state->flags.stream_checksum)
461		state->xxh32_state = __archive_xxhash.XXH32_init(0);
462
463	state->decoded_size = 0;
464	/* Success */
465	return (ARCHIVE_OK);
466malformed_error:
467	archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC,
468	    "malformed lz4 data");
469	return (ARCHIVE_FATAL);
470}
471
472static ssize_t
473lz4_filter_read_data_block(struct archive_read_filter *self, const void **p)
474{
475	struct private_data *state = (struct private_data *)self->data;
476	ssize_t compressed_size;
477	const char *read_buf;
478	ssize_t bytes_remaining;
479	int checksum_size;
480	ssize_t uncompressed_size;
481	size_t prefix64k;
482
483	*p = NULL;
484
485	/* Make sure we have 4 bytes for a block size. */
486	read_buf = __archive_read_filter_ahead(self->upstream, 4,
487	    &bytes_remaining);
488	if (read_buf == NULL)
489		goto truncated_error;
490	compressed_size = archive_le32dec(read_buf);
491	if ((compressed_size & 0x7fffffff) > state->flags.block_maximum_size)
492		goto malformed_error;
493	/* A compressed size == 0 means the end of stream blocks. */
494	if (compressed_size == 0) {
495		__archive_read_filter_consume(self->upstream, 4);
496		return 0;
497	}
498
499	checksum_size = state->flags.block_checksum;
500	/* Check if the block is uncompressed. */
501	if (compressed_size & 0x80000000U) {
502		compressed_size &= 0x7fffffff;
503		uncompressed_size = compressed_size;
504	} else
505		uncompressed_size = 0;/* Unknown yet. */
506
507	/*
508	  Unfortunately, lz4 decompression API requires a whole block
509	  for its decompression speed, so we read a whole block and allocate
510	  a huge buffer used for decoded data.
511	*/
512	read_buf = __archive_read_filter_ahead(self->upstream,
513	    4 + compressed_size + checksum_size, &bytes_remaining);
514	if (read_buf == NULL)
515		goto truncated_error;
516
517	/* Optional processing, checking a block sum. */
518	if (checksum_size) {
519		unsigned int chsum = __archive_xxhash.XXH32(
520			read_buf + 4, (int)compressed_size, 0);
521		unsigned int chsum_block =
522		    archive_le32dec(read_buf + 4 + compressed_size);
523#ifndef DONT_FAIL_ON_CRC_ERROR
524		if (chsum != chsum_block)
525			goto malformed_error;
526#endif
527	}
528
529
530	/* If the block is uncompressed, there is nothing to do. */
531	if (uncompressed_size) {
532		/* Prepare a prefix 64k block for next block. */
533		if (!state->flags.block_independence) {
534			prefix64k = 64 * 1024;
535			if (uncompressed_size < (ssize_t)prefix64k) {
536				memcpy(state->out_block
537					+ prefix64k - uncompressed_size,
538				    read_buf + 4,
539				    uncompressed_size);
540				memset(state->out_block, 0,
541				    prefix64k - uncompressed_size);
542			} else {
543				memcpy(state->out_block,
544				    read_buf + 4
545					+ uncompressed_size - prefix64k,
546				    prefix64k);
547			}
548			state->decoded_size = 0;
549		}
550		state->unconsumed = 4 + uncompressed_size + checksum_size;
551		*p = read_buf + 4;
552		return uncompressed_size;
553	}
554
555	/*
556	   Decompress a block data.
557	 */
558	if (state->flags.block_independence) {
559		prefix64k = 0;
560		uncompressed_size = LZ4_decompress_safe(read_buf + 4,
561		    state->out_block, (int)compressed_size,
562		    state->flags.block_maximum_size);
563	} else {
564		prefix64k = 64 * 1024;
565		if (state->decoded_size) {
566			if (state->decoded_size < prefix64k) {
567				memmove(state->out_block
568					+ prefix64k - state->decoded_size,
569				    state->out_block + prefix64k,
570				    state->decoded_size);
571				memset(state->out_block, 0,
572				    prefix64k - state->decoded_size);
573			} else {
574				memmove(state->out_block,
575				    state->out_block + state->decoded_size,
576				    prefix64k);
577			}
578		}
579#if LZ4_VERSION_MAJOR >= 1 && LZ4_VERSION_MINOR >= 7
580		uncompressed_size = LZ4_decompress_safe_usingDict(
581		    read_buf + 4,
582		    state->out_block + prefix64k, (int)compressed_size,
583		    state->flags.block_maximum_size,
584		    state->out_block,
585		    (int)prefix64k);
586#else
587		uncompressed_size = LZ4_decompress_safe_withPrefix64k(
588		    read_buf + 4,
589		    state->out_block + prefix64k, (int)compressed_size,
590		    state->flags.block_maximum_size);
591#endif
592	}
593
594	/* Check if an error occurred in the decompression process. */
595	if (uncompressed_size < 0) {
596		archive_set_error(&(self->archive->archive),
597		    ARCHIVE_ERRNO_MISC, "lz4 decompression failed");
598		return (ARCHIVE_FATAL);
599	}
600
601	state->unconsumed = 4 + compressed_size + checksum_size;
602	*p = state->out_block + prefix64k;
603	state->decoded_size = uncompressed_size;
604	return uncompressed_size;
605
606malformed_error:
607	archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC,
608	    "malformed lz4 data");
609	return (ARCHIVE_FATAL);
610truncated_error:
611	archive_set_error(&self->archive->archive, ARCHIVE_ERRNO_MISC,
612	    "truncated lz4 input");
613	return (ARCHIVE_FATAL);
614}
615
616static ssize_t
617lz4_filter_read_default_stream(struct archive_read_filter *self, const void **p)
618{
619	struct private_data *state = (struct private_data *)self->data;
620	const char *read_buf;
621	ssize_t bytes_remaining;
622	ssize_t ret;
623
624	if (state->stage == SELECT_STREAM) {
625		state->stage = READ_DEFAULT_STREAM;
626		/* First, read a descriptor. */
627		if((ret = lz4_filter_read_descriptor(self)) != ARCHIVE_OK)
628			return (ret);
629		state->stage = READ_DEFAULT_BLOCK;
630	}
631	/* Decompress a block. */
632	ret = lz4_filter_read_data_block(self, p);
633
634	/* If the end of block is detected, change the filter status
635	   to read next stream. */
636	if (ret == 0 && *p == NULL)
637		state->stage = SELECT_STREAM;
638
639	/* Optional processing, checking a stream sum. */
640	if (state->flags.stream_checksum) {
641		if (state->stage == SELECT_STREAM) {
642			unsigned int checksum;
643			unsigned int checksum_stream;
644			read_buf = __archive_read_filter_ahead(self->upstream,
645			    4, &bytes_remaining);
646			if (read_buf == NULL) {
647				archive_set_error(&self->archive->archive,
648				    ARCHIVE_ERRNO_MISC, "truncated lz4 input");
649				return (ARCHIVE_FATAL);
650			}
651			checksum = archive_le32dec(read_buf);
652			__archive_read_filter_consume(self->upstream, 4);
653			checksum_stream = __archive_xxhash.XXH32_digest(
654			    state->xxh32_state);
655			state->xxh32_state = NULL;
656			if (checksum != checksum_stream) {
657#ifndef DONT_FAIL_ON_CRC_ERROR
658				archive_set_error(&self->archive->archive,
659				    ARCHIVE_ERRNO_MISC,
660				    "lz4 stream checksum error");
661				return (ARCHIVE_FATAL);
662#endif
663			}
664		} else if (ret > 0)
665			__archive_xxhash.XXH32_update(state->xxh32_state,
666			    *p, (int)ret);
667	}
668	return (ret);
669}
670
671static ssize_t
672lz4_filter_read_legacy_stream(struct archive_read_filter *self, const void **p)
673{
674	struct private_data *state = (struct private_data *)self->data;
675	uint32_t compressed;
676	const char *read_buf;
677	ssize_t ret;
678
679	*p = NULL;
680	ret = lz4_allocate_out_block_for_legacy(self);
681	if (ret != ARCHIVE_OK)
682		return ret;
683
684	/* Make sure we have 4 bytes for a block size. */
685	read_buf = __archive_read_filter_ahead(self->upstream, 4, NULL);
686	if (read_buf == NULL) {
687		if (state->stage == SELECT_STREAM) {
688			state->stage = READ_LEGACY_STREAM;
689			archive_set_error(&self->archive->archive,
690			    ARCHIVE_ERRNO_MISC,
691			    "truncated lz4 input");
692			return (ARCHIVE_FATAL);
693		}
694		state->stage = SELECT_STREAM;
695		return 0;
696	}
697	state->stage = READ_LEGACY_BLOCK;
698	compressed = archive_le32dec(read_buf);
699	if (compressed > LZ4_COMPRESSBOUND(LEGACY_BLOCK_SIZE)) {
700		state->stage = SELECT_STREAM;
701		return 0;
702	}
703
704	/* Make sure we have a whole block. */
705	read_buf = __archive_read_filter_ahead(self->upstream,
706	    4 + compressed, NULL);
707	if (read_buf == NULL) {
708		archive_set_error(&(self->archive->archive),
709		    ARCHIVE_ERRNO_MISC, "truncated lz4 input");
710		return (ARCHIVE_FATAL);
711	}
712	ret = LZ4_decompress_safe(read_buf + 4, state->out_block,
713	    compressed, (int)state->out_block_size);
714	if (ret < 0) {
715		archive_set_error(&(self->archive->archive),
716		    ARCHIVE_ERRNO_MISC, "lz4 decompression failed");
717		return (ARCHIVE_FATAL);
718	}
719	*p = state->out_block;
720	state->unconsumed = 4 + compressed;
721	return ret;
722}
723
724/*
725 * Clean up the decompressor.
726 */
727static int
728lz4_filter_close(struct archive_read_filter *self)
729{
730	struct private_data *state;
731	int ret = ARCHIVE_OK;
732
733	state = (struct private_data *)self->data;
734	free(state->xxh32_state);
735	free(state->out_block);
736	free(state);
737	return (ret);
738}
739
740#endif /* HAVE_LIBLZ4 */
741