archive_read_support_format_cab.c revision 302001
1/*-
2 * Copyright (c) 2010-2012 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#ifdef HAVE_LIMITS_H
32#include <limits.h>
33#endif
34#ifdef HAVE_STDLIB_H
35#include <stdlib.h>
36#endif
37#ifdef HAVE_STRING_H
38#include <string.h>
39#endif
40#ifdef HAVE_ZLIB_H
41#include <zlib.h>
42#endif
43
44#include "archive.h"
45#include "archive_entry.h"
46#include "archive_entry_locale.h"
47#include "archive_private.h"
48#include "archive_read_private.h"
49#include "archive_endian.h"
50
51
52struct lzx_dec {
53	/* Decoding status. */
54	int     		 state;
55
56	/*
57	 * Window to see last decoded data, from 32KBi to 2MBi.
58	 */
59	int			 w_size;
60	int			 w_mask;
61	/* Window buffer, which is a loop buffer. */
62	unsigned char		*w_buff;
63	/* The insert position to the window. */
64	int			 w_pos;
65	/* The position where we can copy decoded code from the window. */
66	int     		 copy_pos;
67	/* The length how many bytes we can copy decoded code from
68	 * the window. */
69	int     		 copy_len;
70	/* Translation reversal for x86 proccessor CALL byte sequence(E8).
71	 * This is used for LZX only. */
72	uint32_t		 translation_size;
73	char			 translation;
74	char			 block_type;
75#define VERBATIM_BLOCK		1
76#define ALIGNED_OFFSET_BLOCK	2
77#define UNCOMPRESSED_BLOCK	3
78	size_t			 block_size;
79	size_t			 block_bytes_avail;
80	/* Repeated offset. */
81	int			 r0, r1, r2;
82	unsigned char		 rbytes[4];
83	int			 rbytes_avail;
84	int			 length_header;
85	int			 position_slot;
86	int			 offset_bits;
87
88	struct lzx_pos_tbl {
89		int		 base;
90		int		 footer_bits;
91	}			*pos_tbl;
92	/*
93	 * Bit stream reader.
94	 */
95	struct lzx_br {
96#define CACHE_TYPE		uint64_t
97#define CACHE_BITS		(8 * sizeof(CACHE_TYPE))
98	 	/* Cache buffer. */
99		CACHE_TYPE	 cache_buffer;
100		/* Indicates how many bits avail in cache_buffer. */
101		int		 cache_avail;
102		unsigned char	 odd;
103		char		 have_odd;
104	} br;
105
106	/*
107	 * Huffman coding.
108	 */
109	struct huffman {
110		int		 len_size;
111		int		 freq[17];
112		unsigned char	*bitlen;
113
114		/*
115		 * Use a index table. It's faster than searching a huffman
116		 * coding tree, which is a binary tree. But a use of a large
117		 * index table causes L1 cache read miss many times.
118		 */
119#define HTBL_BITS	10
120		int		 max_bits;
121		int		 shift_bits;
122		int		 tbl_bits;
123		int		 tree_used;
124		int		 tree_avail;
125		/* Direct access table. */
126		uint16_t	*tbl;
127		/* Binary tree table for extra bits over the direct access. */
128		struct htree_t {
129			uint16_t left;
130			uint16_t right;
131		}		*tree;
132	}			 at, lt, mt, pt;
133
134	int			 loop;
135	int			 error;
136};
137
138static const int slots[] = {
139	30, 32, 34, 36, 38, 42, 50, 66, 98, 162, 290
140};
141#define SLOT_BASE	15
142#define SLOT_MAX	21/*->25*/
143
144struct lzx_stream {
145	const unsigned char	*next_in;
146	int64_t			 avail_in;
147	int64_t			 total_in;
148	unsigned char		*next_out;
149	int64_t			 avail_out;
150	int64_t			 total_out;
151	struct lzx_dec		*ds;
152};
153
154/*
155 * Cabinet file definitions.
156 */
157/* CFHEADER offset */
158#define CFHEADER_signature	0
159#define CFHEADER_cbCabinet	8
160#define CFHEADER_coffFiles	16
161#define CFHEADER_versionMinor	24
162#define CFHEADER_versionMajor	25
163#define CFHEADER_cFolders	26
164#define CFHEADER_cFiles		28
165#define CFHEADER_flags		30
166#define CFHEADER_setID		32
167#define CFHEADER_iCabinet	34
168#define CFHEADER_cbCFHeader	36
169#define CFHEADER_cbCFFolder	38
170#define CFHEADER_cbCFData	39
171
172/* CFFOLDER offset */
173#define CFFOLDER_coffCabStart	0
174#define CFFOLDER_cCFData	4
175#define CFFOLDER_typeCompress	6
176#define CFFOLDER_abReserve	8
177
178/* CFFILE offset */
179#define CFFILE_cbFile		0
180#define CFFILE_uoffFolderStart	4
181#define CFFILE_iFolder		8
182#define CFFILE_date_time	10
183#define CFFILE_attribs		14
184
185/* CFDATA offset */
186#define CFDATA_csum		0
187#define CFDATA_cbData		4
188#define CFDATA_cbUncomp		6
189
190static const char *compression_name[] = {
191	"NONE",
192	"MSZIP",
193	"Quantum",
194	"LZX",
195};
196
197struct cfdata {
198	/* Sum value of this CFDATA. */
199	uint32_t		 sum;
200	uint16_t		 compressed_size;
201	uint16_t		 compressed_bytes_remaining;
202	uint16_t		 uncompressed_size;
203	uint16_t		 uncompressed_bytes_remaining;
204	/* To know how many bytes we have decompressed. */
205	uint16_t		 uncompressed_avail;
206	/* Offset from the beginning of compressed data of this CFDATA */
207	uint16_t		 read_offset;
208	int64_t			 unconsumed;
209	/* To keep memory image of this CFDATA to compute the sum. */
210	size_t			 memimage_size;
211	unsigned char		*memimage;
212	/* Result of calculation of sum. */
213	uint32_t		 sum_calculated;
214	unsigned char		 sum_extra[4];
215	int			 sum_extra_avail;
216	const void		*sum_ptr;
217};
218
219struct cffolder {
220	uint32_t		 cfdata_offset_in_cab;
221	uint16_t		 cfdata_count;
222	uint16_t		 comptype;
223#define COMPTYPE_NONE		0x0000
224#define COMPTYPE_MSZIP		0x0001
225#define COMPTYPE_QUANTUM	0x0002
226#define COMPTYPE_LZX		0x0003
227	uint16_t		 compdata;
228	const char		*compname;
229	/* At the time reading CFDATA */
230	struct cfdata		 cfdata;
231	int			 cfdata_index;
232	/* Flags to mark progress of decompression. */
233	char			 decompress_init;
234};
235
236struct cffile {
237	uint32_t		 uncompressed_size;
238	uint32_t		 offset;
239	time_t			 mtime;
240	uint16_t	 	 folder;
241#define iFoldCONTINUED_FROM_PREV	0xFFFD
242#define iFoldCONTINUED_TO_NEXT		0xFFFE
243#define iFoldCONTINUED_PREV_AND_NEXT	0xFFFF
244	unsigned char		 attr;
245#define ATTR_RDONLY		0x01
246#define ATTR_NAME_IS_UTF	0x80
247	struct archive_string 	 pathname;
248};
249
250struct cfheader {
251	/* Total bytes of all file size in a Cabinet. */
252	uint32_t		 total_bytes;
253	uint32_t		 files_offset;
254	uint16_t		 folder_count;
255	uint16_t		 file_count;
256	uint16_t		 flags;
257#define PREV_CABINET	0x0001
258#define NEXT_CABINET	0x0002
259#define RESERVE_PRESENT	0x0004
260	uint16_t		 setid;
261	uint16_t		 cabinet;
262	/* Version number. */
263	unsigned char		 major;
264	unsigned char		 minor;
265	unsigned char		 cffolder;
266	unsigned char		 cfdata;
267	/* All folders in a cabinet. */
268	struct cffolder		*folder_array;
269	/* All files in a cabinet. */
270	struct cffile		*file_array;
271	int			 file_index;
272};
273
274struct cab {
275	/* entry_bytes_remaining is the number of bytes we expect.	    */
276	int64_t			 entry_offset;
277	int64_t			 entry_bytes_remaining;
278	int64_t			 entry_unconsumed;
279	int64_t			 entry_compressed_bytes_read;
280	int64_t			 entry_uncompressed_bytes_read;
281	struct cffolder		*entry_cffolder;
282	struct cffile		*entry_cffile;
283	struct cfdata		*entry_cfdata;
284
285	/* Offset from beginning of a cabinet file. */
286	int64_t			 cab_offset;
287	struct cfheader		 cfheader;
288	struct archive_wstring	 ws;
289
290	/* Flag to mark progress that an archive was read their first header.*/
291	char			 found_header;
292	char			 end_of_archive;
293	char			 end_of_entry;
294	char			 end_of_entry_cleanup;
295	char			 read_data_invoked;
296	int64_t			 bytes_skipped;
297
298	unsigned char		*uncompressed_buffer;
299	size_t			 uncompressed_buffer_size;
300
301	int			 init_default_conversion;
302	struct archive_string_conv *sconv;
303	struct archive_string_conv *sconv_default;
304	struct archive_string_conv *sconv_utf8;
305	char			 format_name[64];
306
307#ifdef HAVE_ZLIB_H
308	z_stream		 stream;
309	char			 stream_valid;
310#endif
311	struct lzx_stream	 xstrm;
312};
313
314static int	archive_read_format_cab_bid(struct archive_read *, int);
315static int	archive_read_format_cab_options(struct archive_read *,
316		    const char *, const char *);
317static int	archive_read_format_cab_read_header(struct archive_read *,
318		    struct archive_entry *);
319static int	archive_read_format_cab_read_data(struct archive_read *,
320		    const void **, size_t *, int64_t *);
321static int	archive_read_format_cab_read_data_skip(struct archive_read *);
322static int	archive_read_format_cab_cleanup(struct archive_read *);
323
324static int	cab_skip_sfx(struct archive_read *);
325static time_t	cab_dos_time(const unsigned char *);
326static int	cab_read_data(struct archive_read *, const void **,
327		    size_t *, int64_t *);
328static int	cab_read_header(struct archive_read *);
329static uint32_t cab_checksum_cfdata_4(const void *, size_t bytes, uint32_t);
330static uint32_t cab_checksum_cfdata(const void *, size_t bytes, uint32_t);
331static void	cab_checksum_update(struct archive_read *, size_t);
332static int	cab_checksum_finish(struct archive_read *);
333static int	cab_next_cfdata(struct archive_read *);
334static const void *cab_read_ahead_cfdata(struct archive_read *, ssize_t *);
335static const void *cab_read_ahead_cfdata_none(struct archive_read *, ssize_t *);
336static const void *cab_read_ahead_cfdata_deflate(struct archive_read *,
337		    ssize_t *);
338static const void *cab_read_ahead_cfdata_lzx(struct archive_read *,
339		    ssize_t *);
340static int64_t	cab_consume_cfdata(struct archive_read *, int64_t);
341static int64_t	cab_minimum_consume_cfdata(struct archive_read *, int64_t);
342static int	lzx_decode_init(struct lzx_stream *, int);
343static int	lzx_read_blocks(struct lzx_stream *, int);
344static int	lzx_decode_blocks(struct lzx_stream *, int);
345static void	lzx_decode_free(struct lzx_stream *);
346static void	lzx_translation(struct lzx_stream *, void *, size_t, uint32_t);
347static void	lzx_cleanup_bitstream(struct lzx_stream *);
348static int	lzx_decode(struct lzx_stream *, int);
349static int	lzx_read_pre_tree(struct lzx_stream *);
350static int	lzx_read_bitlen(struct lzx_stream *, struct huffman *, int);
351static int	lzx_huffman_init(struct huffman *, size_t, int);
352static void	lzx_huffman_free(struct huffman *);
353static int	lzx_make_huffman_table(struct huffman *);
354static inline int lzx_decode_huffman(struct huffman *, unsigned);
355static int	lzx_decode_huffman_tree(struct huffman *, unsigned, int);
356
357
358int
359archive_read_support_format_cab(struct archive *_a)
360{
361	struct archive_read *a = (struct archive_read *)_a;
362	struct cab *cab;
363	int r;
364
365	archive_check_magic(_a, ARCHIVE_READ_MAGIC,
366	    ARCHIVE_STATE_NEW, "archive_read_support_format_cab");
367
368	cab = (struct cab *)calloc(1, sizeof(*cab));
369	if (cab == NULL) {
370		archive_set_error(&a->archive, ENOMEM,
371		    "Can't allocate CAB data");
372		return (ARCHIVE_FATAL);
373	}
374	archive_string_init(&cab->ws);
375	archive_wstring_ensure(&cab->ws, 256);
376
377	r = __archive_read_register_format(a,
378	    cab,
379	    "cab",
380	    archive_read_format_cab_bid,
381	    archive_read_format_cab_options,
382	    archive_read_format_cab_read_header,
383	    archive_read_format_cab_read_data,
384	    archive_read_format_cab_read_data_skip,
385	    NULL,
386	    archive_read_format_cab_cleanup,
387	    NULL,
388	    NULL);
389
390	if (r != ARCHIVE_OK)
391		free(cab);
392	return (ARCHIVE_OK);
393}
394
395static int
396find_cab_magic(const char *p)
397{
398	switch (p[4]) {
399	case 0:
400		/*
401		 * Note: Self-Extraction program has 'MSCF' string in their
402		 * program. If we were finding 'MSCF' string only, we got
403		 * wrong place for Cabinet header, thus, we have to check
404		 * following four bytes which are reserved and must be set
405		 * to zero.
406		 */
407		if (memcmp(p, "MSCF\0\0\0\0", 8) == 0)
408			return 0;
409		return 5;
410	case 'F': return 1;
411	case 'C': return 2;
412	case 'S': return 3;
413	case 'M': return 4;
414	default:  return 5;
415	}
416}
417
418static int
419archive_read_format_cab_bid(struct archive_read *a, int best_bid)
420{
421	const char *p;
422	ssize_t bytes_avail, offset, window;
423
424	/* If there's already a better bid than we can ever
425	   make, don't bother testing. */
426	if (best_bid > 64)
427		return (-1);
428
429	if ((p = __archive_read_ahead(a, 8, NULL)) == NULL)
430		return (-1);
431
432	if (memcmp(p, "MSCF\0\0\0\0", 8) == 0)
433		return (64);
434
435	/*
436	 * Attempt to handle self-extracting archives
437	 * by noting a PE header and searching forward
438	 * up to 128k for a 'MSCF' marker.
439	 */
440	if (p[0] == 'M' && p[1] == 'Z') {
441		offset = 0;
442		window = 4096;
443		while (offset < (1024 * 128)) {
444			const char *h = __archive_read_ahead(a, offset + window,
445			    &bytes_avail);
446			if (h == NULL) {
447				/* Remaining bytes are less than window. */
448				window >>= 1;
449				if (window < 128)
450					return (0);
451				continue;
452			}
453			p = h + offset;
454			while (p + 8 < h + bytes_avail) {
455				int next;
456				if ((next = find_cab_magic(p)) == 0)
457					return (64);
458				p += next;
459			}
460			offset = p - h;
461		}
462	}
463	return (0);
464}
465
466static int
467archive_read_format_cab_options(struct archive_read *a,
468    const char *key, const char *val)
469{
470	struct cab *cab;
471	int ret = ARCHIVE_FAILED;
472
473	cab = (struct cab *)(a->format->data);
474	if (strcmp(key, "hdrcharset")  == 0) {
475		if (val == NULL || val[0] == 0)
476			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
477			    "cab: hdrcharset option needs a character-set name");
478		else {
479			cab->sconv = archive_string_conversion_from_charset(
480			    &a->archive, val, 0);
481			if (cab->sconv != NULL)
482				ret = ARCHIVE_OK;
483			else
484				ret = ARCHIVE_FATAL;
485		}
486		return (ret);
487	}
488
489	/* Note: The "warn" return is just to inform the options
490	 * supervisor that we didn't handle it.  It will generate
491	 * a suitable error if no one used this option. */
492	return (ARCHIVE_WARN);
493}
494
495static int
496cab_skip_sfx(struct archive_read *a)
497{
498	const char *p, *q;
499	size_t skip;
500	ssize_t bytes, window;
501
502	window = 4096;
503	for (;;) {
504		const char *h = __archive_read_ahead(a, window, &bytes);
505		if (h == NULL) {
506			/* Remaining size are less than window. */
507			window >>= 1;
508			if (window < 128) {
509				archive_set_error(&a->archive,
510				    ARCHIVE_ERRNO_FILE_FORMAT,
511				    "Couldn't find out CAB header");
512				return (ARCHIVE_FATAL);
513			}
514			continue;
515		}
516		p = h;
517		q = p + bytes;
518
519		/*
520		 * Scan ahead until we find something that looks
521		 * like the cab header.
522		 */
523		while (p + 8 < q) {
524			int next;
525			if ((next = find_cab_magic(p)) == 0) {
526				skip = p - h;
527				__archive_read_consume(a, skip);
528				return (ARCHIVE_OK);
529			}
530			p += next;
531		}
532		skip = p - h;
533		__archive_read_consume(a, skip);
534	}
535}
536
537static int
538truncated_error(struct archive_read *a)
539{
540	archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
541	    "Truncated CAB header");
542	return (ARCHIVE_FATAL);
543}
544
545static ssize_t
546cab_strnlen(const unsigned char *p, size_t maxlen)
547{
548	size_t i;
549
550	for (i = 0; i <= maxlen; i++) {
551		if (p[i] == 0)
552			break;
553	}
554	if (i > maxlen)
555		return (-1);/* invalid */
556	return ((ssize_t)i);
557}
558
559/* Read bytes as much as remaining. */
560static const void *
561cab_read_ahead_remaining(struct archive_read *a, size_t min, ssize_t *avail)
562{
563	const void *p;
564
565	while (min > 0) {
566		p = __archive_read_ahead(a, min, avail);
567		if (p != NULL)
568			return (p);
569		min--;
570	}
571	return (NULL);
572}
573
574/* Convert a path separator '\' -> '/' */
575static int
576cab_convert_path_separator_1(struct archive_string *fn, unsigned char attr)
577{
578	size_t i;
579	int mb;
580
581	/* Easy check if we have '\' in multi-byte string. */
582	mb = 0;
583	for (i = 0; i < archive_strlen(fn); i++) {
584		if (fn->s[i] == '\\') {
585			if (mb) {
586				/* This may be second byte of multi-byte
587				 * character. */
588				break;
589			}
590			fn->s[i] = '/';
591			mb = 0;
592		} else if ((fn->s[i] & 0x80) && !(attr & ATTR_NAME_IS_UTF))
593			mb = 1;
594		else
595			mb = 0;
596	}
597	if (i == archive_strlen(fn))
598		return (0);
599	return (-1);
600}
601
602/*
603 * Replace a character '\' with '/' in wide character.
604 */
605static void
606cab_convert_path_separator_2(struct cab *cab, struct archive_entry *entry)
607{
608	const wchar_t *wp;
609	size_t i;
610
611	/* If a conversion to wide character failed, force the replacement. */
612	if ((wp = archive_entry_pathname_w(entry)) != NULL) {
613		archive_wstrcpy(&(cab->ws), wp);
614		for (i = 0; i < archive_strlen(&(cab->ws)); i++) {
615			if (cab->ws.s[i] == L'\\')
616				cab->ws.s[i] = L'/';
617		}
618		archive_entry_copy_pathname_w(entry, cab->ws.s);
619	}
620}
621
622/*
623 * Read CFHEADER, CFFOLDER and CFFILE.
624 */
625static int
626cab_read_header(struct archive_read *a)
627{
628	const unsigned char *p;
629	struct cab *cab;
630	struct cfheader *hd;
631	size_t bytes, used;
632	ssize_t len;
633	int64_t skip;
634	int err, i;
635	int cur_folder, prev_folder;
636	uint32_t offset32;
637
638	a->archive.archive_format = ARCHIVE_FORMAT_CAB;
639	if (a->archive.archive_format_name == NULL)
640		a->archive.archive_format_name = "CAB";
641
642	if ((p = __archive_read_ahead(a, 42, NULL)) == NULL)
643		return (truncated_error(a));
644
645	cab = (struct cab *)(a->format->data);
646	if (cab->found_header == 0 &&
647	    p[0] == 'M' && p[1] == 'Z') {
648		/* This is an executable?  Must be self-extracting... 	*/
649		err = cab_skip_sfx(a);
650		if (err < ARCHIVE_WARN)
651			return (err);
652
653		if ((p = __archive_read_ahead(a, sizeof(*p), NULL)) == NULL)
654			return (truncated_error(a));
655	}
656
657	cab->cab_offset = 0;
658	/*
659	 * Read CFHEADER.
660	 */
661	hd = &cab->cfheader;
662	if (p[CFHEADER_signature+0] != 'M' || p[CFHEADER_signature+1] != 'S' ||
663	    p[CFHEADER_signature+2] != 'C' || p[CFHEADER_signature+3] != 'F') {
664		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
665		    "Couldn't find out CAB header");
666		return (ARCHIVE_FATAL);
667	}
668	hd->total_bytes = archive_le32dec(p + CFHEADER_cbCabinet);
669	hd->files_offset = archive_le32dec(p + CFHEADER_coffFiles);
670	hd->minor = p[CFHEADER_versionMinor];
671	hd->major = p[CFHEADER_versionMajor];
672	hd->folder_count = archive_le16dec(p + CFHEADER_cFolders);
673	if (hd->folder_count == 0)
674		goto invalid;
675	hd->file_count = archive_le16dec(p + CFHEADER_cFiles);
676	if (hd->file_count == 0)
677		goto invalid;
678	hd->flags = archive_le16dec(p + CFHEADER_flags);
679	hd->setid = archive_le16dec(p + CFHEADER_setID);
680	hd->cabinet = archive_le16dec(p + CFHEADER_iCabinet);
681	used = CFHEADER_iCabinet + 2;
682	if (hd->flags & RESERVE_PRESENT) {
683		uint16_t cfheader;
684		cfheader = archive_le16dec(p + CFHEADER_cbCFHeader);
685		if (cfheader > 60000U)
686			goto invalid;
687		hd->cffolder = p[CFHEADER_cbCFFolder];
688		hd->cfdata = p[CFHEADER_cbCFData];
689		used += 4;/* cbCFHeader, cbCFFolder and cbCFData */
690		used += cfheader;/* abReserve */
691	} else
692		hd->cffolder = 0;/* Avoid compiling warning. */
693	if (hd->flags & PREV_CABINET) {
694		/* How many bytes are used for szCabinetPrev. */
695		if ((p = __archive_read_ahead(a, used+256, NULL)) == NULL)
696			return (truncated_error(a));
697		if ((len = cab_strnlen(p + used, 255)) <= 0)
698			goto invalid;
699		used += len + 1;
700		/* How many bytes are used for szDiskPrev. */
701		if ((p = __archive_read_ahead(a, used+256, NULL)) == NULL)
702			return (truncated_error(a));
703		if ((len = cab_strnlen(p + used, 255)) <= 0)
704			goto invalid;
705		used += len + 1;
706	}
707	if (hd->flags & NEXT_CABINET) {
708		/* How many bytes are used for szCabinetNext. */
709		if ((p = __archive_read_ahead(a, used+256, NULL)) == NULL)
710			return (truncated_error(a));
711		if ((len = cab_strnlen(p + used, 255)) <= 0)
712			goto invalid;
713		used += len + 1;
714		/* How many bytes are used for szDiskNext. */
715		if ((p = __archive_read_ahead(a, used+256, NULL)) == NULL)
716			return (truncated_error(a));
717		if ((len = cab_strnlen(p + used, 255)) <= 0)
718			goto invalid;
719		used += len + 1;
720	}
721	__archive_read_consume(a, used);
722	cab->cab_offset += used;
723	used = 0;
724
725	/*
726	 * Read CFFOLDER.
727	 */
728	hd->folder_array = (struct cffolder *)calloc(
729	    hd->folder_count, sizeof(struct cffolder));
730	if (hd->folder_array == NULL)
731		goto nomem;
732
733	bytes = 8;
734	if (hd->flags & RESERVE_PRESENT)
735		bytes += hd->cffolder;
736	bytes *= hd->folder_count;
737	if ((p = __archive_read_ahead(a, bytes, NULL)) == NULL)
738		return (truncated_error(a));
739	offset32 = 0;
740	for (i = 0; i < hd->folder_count; i++) {
741		struct cffolder *folder = &(hd->folder_array[i]);
742		folder->cfdata_offset_in_cab =
743		    archive_le32dec(p + CFFOLDER_coffCabStart);
744		folder->cfdata_count = archive_le16dec(p+CFFOLDER_cCFData);
745		folder->comptype =
746		    archive_le16dec(p+CFFOLDER_typeCompress) & 0x0F;
747		folder->compdata =
748		    archive_le16dec(p+CFFOLDER_typeCompress) >> 8;
749		/* Get a compression name. */
750		if (folder->comptype <
751		    sizeof(compression_name) / sizeof(compression_name[0]))
752			folder->compname = compression_name[folder->comptype];
753		else
754			folder->compname = "UNKNOWN";
755		p += 8;
756		used += 8;
757		if (hd->flags & RESERVE_PRESENT) {
758			p += hd->cffolder;/* abReserve */
759			used += hd->cffolder;
760		}
761		/*
762		 * Sanity check if each data is acceptable.
763		 */
764		if (offset32 >= folder->cfdata_offset_in_cab)
765			goto invalid;
766		offset32 = folder->cfdata_offset_in_cab;
767
768		/* Set a request to initialize zlib for the CFDATA of
769		 * this folder. */
770		folder->decompress_init = 0;
771	}
772	__archive_read_consume(a, used);
773	cab->cab_offset += used;
774
775	/*
776	 * Read CFFILE.
777	 */
778	/* Seek read pointer to the offset of CFFILE if needed. */
779	skip = (int64_t)hd->files_offset - cab->cab_offset;
780	if (skip <  0) {
781		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
782		    "Invalid offset of CFFILE %jd < %jd",
783		    (intmax_t)hd->files_offset, (intmax_t)cab->cab_offset);
784		return (ARCHIVE_FATAL);
785	}
786	if (skip) {
787		__archive_read_consume(a, skip);
788		cab->cab_offset += skip;
789	}
790	/* Allocate memory for CFDATA */
791	hd->file_array = (struct cffile *)calloc(
792	    hd->file_count, sizeof(struct cffile));
793	if (hd->file_array == NULL)
794		goto nomem;
795
796	prev_folder = -1;
797	for (i = 0; i < hd->file_count; i++) {
798		struct cffile *file = &(hd->file_array[i]);
799		ssize_t avail;
800
801		if ((p = __archive_read_ahead(a, 16, NULL)) == NULL)
802			return (truncated_error(a));
803		file->uncompressed_size = archive_le32dec(p + CFFILE_cbFile);
804		file->offset = archive_le32dec(p + CFFILE_uoffFolderStart);
805		file->folder = archive_le16dec(p + CFFILE_iFolder);
806		file->mtime = cab_dos_time(p + CFFILE_date_time);
807		file->attr = (uint8_t)archive_le16dec(p + CFFILE_attribs);
808		__archive_read_consume(a, 16);
809
810		cab->cab_offset += 16;
811		if ((p = cab_read_ahead_remaining(a, 256, &avail)) == NULL)
812			return (truncated_error(a));
813		if ((len = cab_strnlen(p, avail-1)) <= 0)
814			goto invalid;
815
816		/* Copy a pathname.  */
817		archive_string_init(&(file->pathname));
818		archive_strncpy(&(file->pathname), p, len);
819		__archive_read_consume(a, len + 1);
820		cab->cab_offset += len + 1;
821
822		/*
823		 * Sanity check if each data is acceptable.
824		 */
825		if (file->uncompressed_size > 0x7FFF8000)
826			goto invalid;/* Too large */
827		if ((int64_t)file->offset + (int64_t)file->uncompressed_size
828		    > ARCHIVE_LITERAL_LL(0x7FFF8000))
829			goto invalid;/* Too large */
830		switch (file->folder) {
831		case iFoldCONTINUED_TO_NEXT:
832			/* This must be last file in a folder. */
833			if (i != hd->file_count -1)
834				goto invalid;
835			cur_folder = hd->folder_count -1;
836			break;
837		case iFoldCONTINUED_PREV_AND_NEXT:
838			/* This must be only one file in a folder. */
839			if (hd->file_count != 1)
840				goto invalid;
841			/* FALL THROUGH */
842		case iFoldCONTINUED_FROM_PREV:
843			/* This must be first file in a folder. */
844			if (i != 0)
845				goto invalid;
846			prev_folder = cur_folder = 0;
847			offset32 = file->offset;
848			break;
849		default:
850			if (file->folder >= hd->folder_count)
851				goto invalid;
852			cur_folder = file->folder;
853			break;
854		}
855		/* Dot not back track. */
856		if (cur_folder < prev_folder)
857			goto invalid;
858		if (cur_folder != prev_folder)
859			offset32 = 0;
860		prev_folder = cur_folder;
861
862		/* Make sure there are not any blanks from last file
863		 * contents. */
864		if (offset32 != file->offset)
865			goto invalid;
866		offset32 += file->uncompressed_size;
867
868		/* CFDATA is available for file contents. */
869		if (file->uncompressed_size > 0 &&
870		    hd->folder_array[cur_folder].cfdata_count == 0)
871			goto invalid;
872	}
873
874	if (hd->cabinet != 0 || hd->flags & (PREV_CABINET | NEXT_CABINET)) {
875		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
876		    "Multivolume cabinet file is unsupported");
877		return (ARCHIVE_WARN);
878	}
879	return (ARCHIVE_OK);
880invalid:
881	archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
882	    "Invalid CAB header");
883	return (ARCHIVE_FATAL);
884nomem:
885	archive_set_error(&a->archive, ENOMEM,
886	    "Can't allocate memory for CAB data");
887	return (ARCHIVE_FATAL);
888}
889
890static int
891archive_read_format_cab_read_header(struct archive_read *a,
892    struct archive_entry *entry)
893{
894	struct cab *cab;
895	struct cfheader *hd;
896	struct cffolder *prev_folder;
897	struct cffile *file;
898	struct archive_string_conv *sconv;
899	int err = ARCHIVE_OK, r;
900
901	cab = (struct cab *)(a->format->data);
902	if (cab->found_header == 0) {
903		err = cab_read_header(a);
904		if (err < ARCHIVE_WARN)
905			return (err);
906		/* We've found the header. */
907		cab->found_header = 1;
908	}
909	hd = &cab->cfheader;
910
911	if (hd->file_index >= hd->file_count) {
912		cab->end_of_archive = 1;
913		return (ARCHIVE_EOF);
914	}
915	file = &hd->file_array[hd->file_index++];
916
917	cab->end_of_entry = 0;
918	cab->end_of_entry_cleanup = 0;
919	cab->entry_compressed_bytes_read = 0;
920	cab->entry_uncompressed_bytes_read = 0;
921	cab->entry_unconsumed = 0;
922	cab->entry_cffile = file;
923
924	/*
925	 * Choose a proper folder.
926	 */
927	prev_folder = cab->entry_cffolder;
928	switch (file->folder) {
929	case iFoldCONTINUED_FROM_PREV:
930	case iFoldCONTINUED_PREV_AND_NEXT:
931		cab->entry_cffolder = &hd->folder_array[0];
932		break;
933	case iFoldCONTINUED_TO_NEXT:
934		cab->entry_cffolder = &hd->folder_array[hd->folder_count-1];
935		break;
936	default:
937		cab->entry_cffolder = &hd->folder_array[file->folder];
938		break;
939	}
940	/* If a cffolder of this file is changed, reset a cfdata to read
941	 * file contents from next cfdata. */
942	if (prev_folder != cab->entry_cffolder)
943		cab->entry_cfdata = NULL;
944
945	/* If a pathname is UTF-8, prepare a string conversion object
946	 * for UTF-8 and use it. */
947	if (file->attr & ATTR_NAME_IS_UTF) {
948		if (cab->sconv_utf8 == NULL) {
949			cab->sconv_utf8 =
950			    archive_string_conversion_from_charset(
951				&(a->archive), "UTF-8", 1);
952			if (cab->sconv_utf8 == NULL)
953				return (ARCHIVE_FATAL);
954		}
955		sconv = cab->sconv_utf8;
956	} else if (cab->sconv != NULL) {
957		/* Choose the conversion specified by the option. */
958		sconv = cab->sconv;
959	} else {
960		/* Choose the default conversion. */
961		if (!cab->init_default_conversion) {
962			cab->sconv_default =
963			    archive_string_default_conversion_for_read(
964			      &(a->archive));
965			cab->init_default_conversion = 1;
966		}
967		sconv = cab->sconv_default;
968	}
969
970	/*
971	 * Set a default value and common data
972	 */
973	r = cab_convert_path_separator_1(&(file->pathname), file->attr);
974	if (archive_entry_copy_pathname_l(entry, file->pathname.s,
975	    archive_strlen(&(file->pathname)), sconv) != 0) {
976		if (errno == ENOMEM) {
977			archive_set_error(&a->archive, ENOMEM,
978			    "Can't allocate memory for Pathname");
979			return (ARCHIVE_FATAL);
980		}
981		archive_set_error(&a->archive,
982		    ARCHIVE_ERRNO_FILE_FORMAT,
983		    "Pathname cannot be converted "
984		    "from %s to current locale.",
985		    archive_string_conversion_charset_name(sconv));
986		err = ARCHIVE_WARN;
987	}
988	if (r < 0) {
989		/* Convert a path separator '\' -> '/' */
990		cab_convert_path_separator_2(cab, entry);
991	}
992
993	archive_entry_set_size(entry, file->uncompressed_size);
994	if (file->attr & ATTR_RDONLY)
995		archive_entry_set_mode(entry, AE_IFREG | 0555);
996	else
997		archive_entry_set_mode(entry, AE_IFREG | 0666);
998	archive_entry_set_mtime(entry, file->mtime, 0);
999
1000	cab->entry_bytes_remaining = file->uncompressed_size;
1001	cab->entry_offset = 0;
1002	/* We don't need compress data. */
1003	if (file->uncompressed_size == 0)
1004		cab->end_of_entry_cleanup = cab->end_of_entry = 1;
1005
1006	/* Set up a more descriptive format name. */
1007	sprintf(cab->format_name, "CAB %d.%d (%s)",
1008	    hd->major, hd->minor, cab->entry_cffolder->compname);
1009	a->archive.archive_format_name = cab->format_name;
1010
1011	return (err);
1012}
1013
1014static int
1015archive_read_format_cab_read_data(struct archive_read *a,
1016    const void **buff, size_t *size, int64_t *offset)
1017{
1018	struct cab *cab = (struct cab *)(a->format->data);
1019	int r;
1020
1021	switch (cab->entry_cffile->folder) {
1022	case iFoldCONTINUED_FROM_PREV:
1023	case iFoldCONTINUED_TO_NEXT:
1024	case iFoldCONTINUED_PREV_AND_NEXT:
1025		*buff = NULL;
1026		*size = 0;
1027		*offset = 0;
1028		archive_clear_error(&a->archive);
1029		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1030		    "Cannot restore this file split in multivolume.");
1031		return (ARCHIVE_FAILED);
1032	default:
1033		break;
1034	}
1035	if (cab->read_data_invoked == 0) {
1036		if (cab->bytes_skipped) {
1037			if (cab->entry_cfdata == NULL) {
1038				r = cab_next_cfdata(a);
1039				if (r < 0)
1040					return (r);
1041			}
1042			if (cab_consume_cfdata(a, cab->bytes_skipped) < 0)
1043				return (ARCHIVE_FATAL);
1044			cab->bytes_skipped = 0;
1045		}
1046		cab->read_data_invoked = 1;
1047	}
1048	if (cab->entry_unconsumed) {
1049		/* Consume as much as the compressor actually used. */
1050		r = (int)cab_consume_cfdata(a, cab->entry_unconsumed);
1051		cab->entry_unconsumed = 0;
1052		if (r < 0)
1053			return (r);
1054	}
1055	if (cab->end_of_archive || cab->end_of_entry) {
1056		if (!cab->end_of_entry_cleanup) {
1057			/* End-of-entry cleanup done. */
1058			cab->end_of_entry_cleanup = 1;
1059		}
1060		*offset = cab->entry_offset;
1061		*size = 0;
1062		*buff = NULL;
1063		return (ARCHIVE_EOF);
1064	}
1065
1066	return (cab_read_data(a, buff, size, offset));
1067}
1068
1069static uint32_t
1070cab_checksum_cfdata_4(const void *p, size_t bytes, uint32_t seed)
1071{
1072	const unsigned char *b;
1073	unsigned u32num;
1074	uint32_t sum;
1075
1076	u32num = (unsigned)bytes / 4;
1077	sum = seed;
1078	b = p;
1079	for (;u32num > 0; --u32num) {
1080		sum ^= archive_le32dec(b);
1081		b += 4;
1082	}
1083	return (sum);
1084}
1085
1086static uint32_t
1087cab_checksum_cfdata(const void *p, size_t bytes, uint32_t seed)
1088{
1089	const unsigned char *b;
1090	uint32_t sum;
1091	uint32_t t;
1092
1093	sum = cab_checksum_cfdata_4(p, bytes, seed);
1094	b = p;
1095	b += bytes & ~3;
1096	t = 0;
1097	switch (bytes & 3) {
1098	case 3:
1099		t |= ((uint32_t)(*b++)) << 16;
1100		/* FALL THROUGH */
1101	case 2:
1102		t |= ((uint32_t)(*b++)) << 8;
1103		/* FALL THROUGH */
1104	case 1:
1105		t |= *b;
1106		/* FALL THROUGH */
1107	default:
1108		break;
1109	}
1110	sum ^= t;
1111
1112	return (sum);
1113}
1114
1115static void
1116cab_checksum_update(struct archive_read *a, size_t bytes)
1117{
1118	struct cab *cab = (struct cab *)(a->format->data);
1119	struct cfdata *cfdata = cab->entry_cfdata;
1120	const unsigned char *p;
1121	size_t sumbytes;
1122
1123	if (cfdata->sum == 0 || cfdata->sum_ptr == NULL)
1124		return;
1125	/*
1126	 * Calculate the sum of this CFDATA.
1127	 * Make sure CFDATA must be calculated in four bytes.
1128	 */
1129	p = cfdata->sum_ptr;
1130	sumbytes = bytes;
1131	if (cfdata->sum_extra_avail) {
1132		while (cfdata->sum_extra_avail < 4 && sumbytes > 0) {
1133			cfdata->sum_extra[
1134			    cfdata->sum_extra_avail++] = *p++;
1135			sumbytes--;
1136		}
1137		if (cfdata->sum_extra_avail == 4) {
1138			cfdata->sum_calculated = cab_checksum_cfdata_4(
1139			    cfdata->sum_extra, 4, cfdata->sum_calculated);
1140			cfdata->sum_extra_avail = 0;
1141		}
1142	}
1143	if (sumbytes) {
1144		int odd = sumbytes & 3;
1145		if (sumbytes - odd > 0)
1146			cfdata->sum_calculated = cab_checksum_cfdata_4(
1147			    p, sumbytes - odd, cfdata->sum_calculated);
1148		if (odd)
1149			memcpy(cfdata->sum_extra, p + sumbytes - odd, odd);
1150		cfdata->sum_extra_avail = odd;
1151	}
1152	cfdata->sum_ptr = NULL;
1153}
1154
1155static int
1156cab_checksum_finish(struct archive_read *a)
1157{
1158	struct cab *cab = (struct cab *)(a->format->data);
1159	struct cfdata *cfdata = cab->entry_cfdata;
1160	int l;
1161
1162	/* Do not need to compute a sum. */
1163	if (cfdata->sum == 0)
1164		return (ARCHIVE_OK);
1165
1166	/*
1167	 * Calculate the sum of remaining CFDATA.
1168	 */
1169	if (cfdata->sum_extra_avail) {
1170		cfdata->sum_calculated =
1171		    cab_checksum_cfdata(cfdata->sum_extra,
1172		       cfdata->sum_extra_avail, cfdata->sum_calculated);
1173		cfdata->sum_extra_avail = 0;
1174	}
1175
1176	l = 4;
1177	if (cab->cfheader.flags & RESERVE_PRESENT)
1178		l += cab->cfheader.cfdata;
1179	cfdata->sum_calculated = cab_checksum_cfdata(
1180	    cfdata->memimage + CFDATA_cbData, l, cfdata->sum_calculated);
1181	if (cfdata->sum_calculated != cfdata->sum) {
1182		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1183		    "Checksum error CFDATA[%d] %x:%x in %d bytes",
1184		    cab->entry_cffolder->cfdata_index -1,
1185		    cfdata->sum, cfdata->sum_calculated,
1186		    cfdata->compressed_size);
1187		return (ARCHIVE_FAILED);
1188	}
1189	return (ARCHIVE_OK);
1190}
1191
1192/*
1193 * Read CFDATA if needed.
1194 */
1195static int
1196cab_next_cfdata(struct archive_read *a)
1197{
1198	struct cab *cab = (struct cab *)(a->format->data);
1199	struct cfdata *cfdata = cab->entry_cfdata;
1200
1201	/* There are remaining bytes in current CFDATA, use it first. */
1202	if (cfdata != NULL && cfdata->uncompressed_bytes_remaining > 0)
1203		return (ARCHIVE_OK);
1204
1205	if (cfdata == NULL) {
1206		int64_t skip;
1207
1208		cab->entry_cffolder->cfdata_index = 0;
1209
1210		/* Seek read pointer to the offset of CFDATA if needed. */
1211		skip = cab->entry_cffolder->cfdata_offset_in_cab
1212			- cab->cab_offset;
1213		if (skip < 0) {
1214			int folder_index;
1215			switch (cab->entry_cffile->folder) {
1216			case iFoldCONTINUED_FROM_PREV:
1217			case iFoldCONTINUED_PREV_AND_NEXT:
1218				folder_index = 0;
1219				break;
1220			case iFoldCONTINUED_TO_NEXT:
1221				folder_index = cab->cfheader.folder_count-1;
1222				break;
1223			default:
1224				folder_index = cab->entry_cffile->folder;
1225				break;
1226			}
1227			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1228			    "Invalid offset of CFDATA in folder(%d) %jd < %jd",
1229			    folder_index,
1230			    (intmax_t)cab->entry_cffolder->cfdata_offset_in_cab,
1231			    (intmax_t)cab->cab_offset);
1232			return (ARCHIVE_FATAL);
1233		}
1234		if (skip > 0) {
1235			if (__archive_read_consume(a, skip) < 0)
1236				return (ARCHIVE_FATAL);
1237			cab->cab_offset =
1238			    cab->entry_cffolder->cfdata_offset_in_cab;
1239		}
1240	}
1241
1242	/*
1243	 * Read a CFDATA.
1244	 */
1245	if (cab->entry_cffolder->cfdata_index <
1246	    cab->entry_cffolder->cfdata_count) {
1247		const unsigned char *p;
1248		int l;
1249
1250		cfdata = &(cab->entry_cffolder->cfdata);
1251		cab->entry_cffolder->cfdata_index++;
1252		cab->entry_cfdata = cfdata;
1253		cfdata->sum_calculated = 0;
1254		cfdata->sum_extra_avail = 0;
1255		cfdata->sum_ptr = NULL;
1256		l = 8;
1257		if (cab->cfheader.flags & RESERVE_PRESENT)
1258			l += cab->cfheader.cfdata;
1259		if ((p = __archive_read_ahead(a, l, NULL)) == NULL)
1260			return (truncated_error(a));
1261		cfdata->sum = archive_le32dec(p + CFDATA_csum);
1262		cfdata->compressed_size = archive_le16dec(p + CFDATA_cbData);
1263		cfdata->compressed_bytes_remaining = cfdata->compressed_size;
1264		cfdata->uncompressed_size =
1265		    archive_le16dec(p + CFDATA_cbUncomp);
1266		cfdata->uncompressed_bytes_remaining =
1267		    cfdata->uncompressed_size;
1268		cfdata->uncompressed_avail = 0;
1269		cfdata->read_offset = 0;
1270		cfdata->unconsumed = 0;
1271
1272		/*
1273		 * Sanity check if data size is acceptable.
1274		 */
1275		if (cfdata->compressed_size == 0 ||
1276		    cfdata->compressed_size > (0x8000+6144))
1277			goto invalid;
1278		if (cfdata->uncompressed_size > 0x8000)
1279			goto invalid;
1280		if (cfdata->uncompressed_size == 0) {
1281			switch (cab->entry_cffile->folder) {
1282			case iFoldCONTINUED_PREV_AND_NEXT:
1283			case iFoldCONTINUED_TO_NEXT:
1284				break;
1285			case iFoldCONTINUED_FROM_PREV:
1286			default:
1287				goto invalid;
1288			}
1289		}
1290		/* If CFDATA is not last in a folder, an uncompressed
1291		 * size must be 0x8000(32KBi) */
1292		if ((cab->entry_cffolder->cfdata_index <
1293		     cab->entry_cffolder->cfdata_count) &&
1294		       cfdata->uncompressed_size != 0x8000)
1295			goto invalid;
1296
1297		/* A compressed data size and an uncompressed data size must
1298		 * be the same in no compression mode. */
1299		if (cab->entry_cffolder->comptype == COMPTYPE_NONE &&
1300		    cfdata->compressed_size != cfdata->uncompressed_size)
1301			goto invalid;
1302
1303		/*
1304		 * Save CFDATA image for sum check.
1305		 */
1306		if (cfdata->memimage_size < (size_t)l) {
1307			free(cfdata->memimage);
1308			cfdata->memimage = malloc(l);
1309			if (cfdata->memimage == NULL) {
1310				archive_set_error(&a->archive, ENOMEM,
1311				    "Can't allocate memory for CAB data");
1312				return (ARCHIVE_FATAL);
1313			}
1314			cfdata->memimage_size = l;
1315		}
1316		memcpy(cfdata->memimage, p, l);
1317
1318		/* Consume bytes as much as we used. */
1319		__archive_read_consume(a, l);
1320		cab->cab_offset += l;
1321	} else if (cab->entry_cffolder->cfdata_count > 0) {
1322		/* Run out of all CFDATA in a folder. */
1323		cfdata->compressed_size = 0;
1324		cfdata->uncompressed_size = 0;
1325		cfdata->compressed_bytes_remaining = 0;
1326		cfdata->uncompressed_bytes_remaining = 0;
1327	} else {
1328		/* Current folder does not have any CFDATA. */
1329		cfdata = &(cab->entry_cffolder->cfdata);
1330		cab->entry_cfdata = cfdata;
1331		memset(cfdata, 0, sizeof(*cfdata));
1332	}
1333	return (ARCHIVE_OK);
1334invalid:
1335	archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1336	    "Invalid CFDATA");
1337	return (ARCHIVE_FATAL);
1338}
1339
1340/*
1341 * Read ahead CFDATA.
1342 */
1343static const void *
1344cab_read_ahead_cfdata(struct archive_read *a, ssize_t *avail)
1345{
1346	struct cab *cab = (struct cab *)(a->format->data);
1347	int err;
1348
1349	err = cab_next_cfdata(a);
1350	if (err < ARCHIVE_OK) {
1351		*avail = err;
1352		return (NULL);
1353	}
1354
1355	switch (cab->entry_cffolder->comptype) {
1356	case COMPTYPE_NONE:
1357		return (cab_read_ahead_cfdata_none(a, avail));
1358	case COMPTYPE_MSZIP:
1359		return (cab_read_ahead_cfdata_deflate(a, avail));
1360	case COMPTYPE_LZX:
1361		return (cab_read_ahead_cfdata_lzx(a, avail));
1362	default: /* Unsupported compression. */
1363		archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1364		    "Unsupported CAB compression : %s",
1365		    cab->entry_cffolder->compname);
1366		*avail = ARCHIVE_FAILED;
1367		return (NULL);
1368	}
1369}
1370
1371/*
1372 * Read ahead CFDATA as uncompressed data.
1373 */
1374static const void *
1375cab_read_ahead_cfdata_none(struct archive_read *a, ssize_t *avail)
1376{
1377	struct cab *cab = (struct cab *)(a->format->data);
1378	struct cfdata *cfdata;
1379	const void *d;
1380
1381	cfdata = cab->entry_cfdata;
1382
1383	/*
1384	 * Note: '1' here is a performance optimization.
1385	 * Recall that the decompression layer returns a count of
1386	 * available bytes; asking for more than that forces the
1387	 * decompressor to combine reads by copying data.
1388	 */
1389	d = __archive_read_ahead(a, 1, avail);
1390	if (*avail <= 0) {
1391		*avail = truncated_error(a);
1392		return (NULL);
1393	}
1394	if (*avail > cfdata->uncompressed_bytes_remaining)
1395		*avail = cfdata->uncompressed_bytes_remaining;
1396	cfdata->uncompressed_avail = cfdata->uncompressed_size;
1397	cfdata->unconsumed = *avail;
1398	cfdata->sum_ptr = d;
1399	return (d);
1400}
1401
1402/*
1403 * Read ahead CFDATA as deflate data.
1404 */
1405#ifdef HAVE_ZLIB_H
1406static const void *
1407cab_read_ahead_cfdata_deflate(struct archive_read *a, ssize_t *avail)
1408{
1409	struct cab *cab = (struct cab *)(a->format->data);
1410	struct cfdata *cfdata;
1411	const void *d;
1412	int r, mszip;
1413	uint16_t uavail;
1414	char eod = 0;
1415
1416	cfdata = cab->entry_cfdata;
1417	/* If the buffer hasn't been allocated, allocate it now. */
1418	if (cab->uncompressed_buffer == NULL) {
1419		cab->uncompressed_buffer_size = 0x8000;
1420		cab->uncompressed_buffer
1421		    = (unsigned char *)malloc(cab->uncompressed_buffer_size);
1422		if (cab->uncompressed_buffer == NULL) {
1423			archive_set_error(&a->archive, ENOMEM,
1424			    "No memory for CAB reader");
1425			*avail = ARCHIVE_FATAL;
1426			return (NULL);
1427		}
1428	}
1429
1430	uavail = cfdata->uncompressed_avail;
1431	if (uavail == cfdata->uncompressed_size) {
1432		d = cab->uncompressed_buffer + cfdata->read_offset;
1433		*avail = uavail - cfdata->read_offset;
1434		return (d);
1435	}
1436
1437	if (!cab->entry_cffolder->decompress_init) {
1438		cab->stream.next_in = NULL;
1439		cab->stream.avail_in = 0;
1440		cab->stream.total_in = 0;
1441		cab->stream.next_out = NULL;
1442		cab->stream.avail_out = 0;
1443		cab->stream.total_out = 0;
1444		if (cab->stream_valid)
1445			r = inflateReset(&cab->stream);
1446		else
1447			r = inflateInit2(&cab->stream,
1448			    -15 /* Don't check for zlib header */);
1449		if (r != Z_OK) {
1450			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1451			    "Can't initialize deflate decompression.");
1452			*avail = ARCHIVE_FATAL;
1453			return (NULL);
1454		}
1455		/* Stream structure has been set up. */
1456		cab->stream_valid = 1;
1457		/* We've initialized decompression for this stream. */
1458		cab->entry_cffolder->decompress_init = 1;
1459	}
1460
1461	if (cfdata->compressed_bytes_remaining == cfdata->compressed_size)
1462		mszip = 2;
1463	else
1464		mszip = 0;
1465	eod = 0;
1466	cab->stream.total_out = uavail;
1467	/*
1468	 * We always uncompress all data in current CFDATA.
1469	 */
1470	while (!eod && cab->stream.total_out < cfdata->uncompressed_size) {
1471		ssize_t bytes_avail;
1472
1473		cab->stream.next_out =
1474		    cab->uncompressed_buffer + cab->stream.total_out;
1475		cab->stream.avail_out =
1476		    cfdata->uncompressed_size - cab->stream.total_out;
1477
1478		d = __archive_read_ahead(a, 1, &bytes_avail);
1479		if (bytes_avail <= 0) {
1480			*avail = truncated_error(a);
1481			return (NULL);
1482		}
1483		if (bytes_avail > cfdata->compressed_bytes_remaining)
1484			bytes_avail = cfdata->compressed_bytes_remaining;
1485		/*
1486		 * A bug in zlib.h: stream.next_in should be marked 'const'
1487		 * but isn't (the library never alters data through the
1488		 * next_in pointer, only reads it).  The result: this ugly
1489		 * cast to remove 'const'.
1490		 */
1491		cab->stream.next_in = (Bytef *)(uintptr_t)d;
1492		cab->stream.avail_in = (uInt)bytes_avail;
1493		cab->stream.total_in = 0;
1494
1495		/* Cut out a tow-byte MSZIP signature(0x43, 0x4b). */
1496		if (mszip > 0) {
1497			if (bytes_avail <= mszip) {
1498				if (mszip == 2) {
1499					if (cab->stream.next_in[0] != 0x43)
1500						goto nomszip;
1501					if (bytes_avail > 1 &&
1502					    cab->stream.next_in[1] != 0x4b)
1503						goto nomszip;
1504				} else if (cab->stream.next_in[0] != 0x4b)
1505					goto nomszip;
1506				cfdata->unconsumed = bytes_avail;
1507				cfdata->sum_ptr = d;
1508				if (cab_minimum_consume_cfdata(
1509				    a, cfdata->unconsumed) < 0) {
1510					*avail = ARCHIVE_FATAL;
1511					return (NULL);
1512				}
1513				mszip -= (int)bytes_avail;
1514				continue;
1515			}
1516			if (mszip == 1 && cab->stream.next_in[0] != 0x4b)
1517				goto nomszip;
1518			else if (cab->stream.next_in[0] != 0x43 ||
1519			    cab->stream.next_in[1] != 0x4b)
1520				goto nomszip;
1521			cab->stream.next_in += mszip;
1522			cab->stream.avail_in -= mszip;
1523			cab->stream.total_in += mszip;
1524			mszip = 0;
1525		}
1526
1527		r = inflate(&cab->stream, 0);
1528		switch (r) {
1529		case Z_OK:
1530			break;
1531		case Z_STREAM_END:
1532			eod = 1;
1533			break;
1534		default:
1535			goto zlibfailed;
1536		}
1537		cfdata->unconsumed = cab->stream.total_in;
1538		cfdata->sum_ptr = d;
1539		if (cab_minimum_consume_cfdata(a, cfdata->unconsumed) < 0) {
1540			*avail = ARCHIVE_FATAL;
1541			return (NULL);
1542		}
1543	}
1544	uavail = (uint16_t)cab->stream.total_out;
1545
1546	if (uavail < cfdata->uncompressed_size) {
1547		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1548		    "Invalid uncompressed size (%d < %d)",
1549		    uavail, cfdata->uncompressed_size);
1550		*avail = ARCHIVE_FATAL;
1551		return (NULL);
1552	}
1553
1554	/*
1555	 * Note: I suspect there is a bug in makecab.exe because, in rare
1556	 * case, compressed bytes are still remaining regardless we have
1557	 * gotten all uncompressed bytes, which size is recoded in CFDATA,
1558	 * as much as we need, and we have to use the garbage so as to
1559	 * correctly compute the sum of CFDATA accordingly.
1560	 */
1561	if (cfdata->compressed_bytes_remaining > 0) {
1562		ssize_t bytes_avail;
1563
1564		d = __archive_read_ahead(a, cfdata->compressed_bytes_remaining,
1565		    &bytes_avail);
1566		if (bytes_avail <= 0) {
1567			*avail = truncated_error(a);
1568			return (NULL);
1569		}
1570		cfdata->unconsumed = cfdata->compressed_bytes_remaining;
1571		cfdata->sum_ptr = d;
1572		if (cab_minimum_consume_cfdata(a, cfdata->unconsumed) < 0) {
1573			*avail = ARCHIVE_FATAL;
1574			return (NULL);
1575		}
1576	}
1577
1578	/*
1579	 * Set dictionary data for decompressing of next CFDATA, which
1580	 * in the same folder. This is why we always do decompress CFDATA
1581	 * even if beginning CFDATA or some of CFDATA are not used in
1582	 * skipping file data.
1583	 */
1584	if (cab->entry_cffolder->cfdata_index <
1585	    cab->entry_cffolder->cfdata_count) {
1586		r = inflateReset(&cab->stream);
1587		if (r != Z_OK)
1588			goto zlibfailed;
1589		r = inflateSetDictionary(&cab->stream,
1590		    cab->uncompressed_buffer, cfdata->uncompressed_size);
1591		if (r != Z_OK)
1592			goto zlibfailed;
1593	}
1594
1595	d = cab->uncompressed_buffer + cfdata->read_offset;
1596	*avail = uavail - cfdata->read_offset;
1597	cfdata->uncompressed_avail = uavail;
1598
1599	return (d);
1600
1601zlibfailed:
1602	switch (r) {
1603	case Z_MEM_ERROR:
1604		archive_set_error(&a->archive, ENOMEM,
1605		    "Out of memory for deflate decompression");
1606		break;
1607	default:
1608		archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1609		    "Deflate decompression failed (%d)", r);
1610		break;
1611	}
1612	*avail = ARCHIVE_FATAL;
1613	return (NULL);
1614nomszip:
1615	archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1616	    "CFDATA incorrect(no MSZIP signature)");
1617	*avail = ARCHIVE_FATAL;
1618	return (NULL);
1619}
1620
1621#else /* HAVE_ZLIB_H */
1622
1623static const void *
1624cab_read_ahead_cfdata_deflate(struct archive_read *a, ssize_t *avail)
1625{
1626	*avail = ARCHIVE_FATAL;
1627	archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1628	    "libarchive compiled without deflate support (no libz)");
1629	return (NULL);
1630}
1631
1632#endif /* HAVE_ZLIB_H */
1633
1634static const void *
1635cab_read_ahead_cfdata_lzx(struct archive_read *a, ssize_t *avail)
1636{
1637	struct cab *cab = (struct cab *)(a->format->data);
1638	struct cfdata *cfdata;
1639	const void *d;
1640	int r;
1641	uint16_t uavail;
1642
1643	cfdata = cab->entry_cfdata;
1644	/* If the buffer hasn't been allocated, allocate it now. */
1645	if (cab->uncompressed_buffer == NULL) {
1646		cab->uncompressed_buffer_size = 0x8000;
1647		cab->uncompressed_buffer
1648		    = (unsigned char *)malloc(cab->uncompressed_buffer_size);
1649		if (cab->uncompressed_buffer == NULL) {
1650			archive_set_error(&a->archive, ENOMEM,
1651			    "No memory for CAB reader");
1652			*avail = ARCHIVE_FATAL;
1653			return (NULL);
1654		}
1655	}
1656
1657	uavail = cfdata->uncompressed_avail;
1658	if (uavail == cfdata->uncompressed_size) {
1659		d = cab->uncompressed_buffer + cfdata->read_offset;
1660		*avail = uavail - cfdata->read_offset;
1661		return (d);
1662	}
1663
1664	if (!cab->entry_cffolder->decompress_init) {
1665		r = lzx_decode_init(&cab->xstrm,
1666		    cab->entry_cffolder->compdata);
1667		if (r != ARCHIVE_OK) {
1668			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1669			    "Can't initialize LZX decompression.");
1670			*avail = ARCHIVE_FATAL;
1671			return (NULL);
1672		}
1673		/* We've initialized decompression for this stream. */
1674		cab->entry_cffolder->decompress_init = 1;
1675	}
1676
1677	/* Clean up remaining bits of previous CFDATA. */
1678	lzx_cleanup_bitstream(&cab->xstrm);
1679	cab->xstrm.total_out = uavail;
1680	while (cab->xstrm.total_out < cfdata->uncompressed_size) {
1681		ssize_t bytes_avail;
1682
1683		cab->xstrm.next_out =
1684		    cab->uncompressed_buffer + cab->xstrm.total_out;
1685		cab->xstrm.avail_out =
1686		    cfdata->uncompressed_size - cab->xstrm.total_out;
1687
1688		d = __archive_read_ahead(a, 1, &bytes_avail);
1689		if (bytes_avail <= 0) {
1690			archive_set_error(&a->archive,
1691			    ARCHIVE_ERRNO_FILE_FORMAT,
1692			    "Truncated CAB file data");
1693			*avail = ARCHIVE_FATAL;
1694			return (NULL);
1695		}
1696		if (bytes_avail > cfdata->compressed_bytes_remaining)
1697			bytes_avail = cfdata->compressed_bytes_remaining;
1698
1699		cab->xstrm.next_in = d;
1700		cab->xstrm.avail_in = bytes_avail;
1701		cab->xstrm.total_in = 0;
1702		r = lzx_decode(&cab->xstrm,
1703		    cfdata->compressed_bytes_remaining == bytes_avail);
1704		switch (r) {
1705		case ARCHIVE_OK:
1706		case ARCHIVE_EOF:
1707			break;
1708		default:
1709			archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1710			    "LZX decompression failed (%d)", r);
1711			*avail = ARCHIVE_FATAL;
1712			return (NULL);
1713		}
1714		cfdata->unconsumed = cab->xstrm.total_in;
1715		cfdata->sum_ptr = d;
1716		if (cab_minimum_consume_cfdata(a, cfdata->unconsumed) < 0) {
1717			*avail = ARCHIVE_FATAL;
1718			return (NULL);
1719		}
1720	}
1721
1722	uavail = (uint16_t)cab->xstrm.total_out;
1723	/*
1724	 * Make sure a read pointer advances to next CFDATA.
1725	 */
1726	if (cfdata->compressed_bytes_remaining > 0) {
1727		ssize_t bytes_avail;
1728
1729		d = __archive_read_ahead(a, cfdata->compressed_bytes_remaining,
1730		    &bytes_avail);
1731		if (bytes_avail <= 0) {
1732			*avail = truncated_error(a);
1733			return (NULL);
1734		}
1735		cfdata->unconsumed = cfdata->compressed_bytes_remaining;
1736		cfdata->sum_ptr = d;
1737		if (cab_minimum_consume_cfdata(a, cfdata->unconsumed) < 0) {
1738			*avail = ARCHIVE_FATAL;
1739			return (NULL);
1740		}
1741	}
1742
1743	/*
1744	 * Translation reversal of x86 proccessor CALL byte sequence(E8).
1745	 */
1746	lzx_translation(&cab->xstrm, cab->uncompressed_buffer,
1747	    cfdata->uncompressed_size,
1748	    (cab->entry_cffolder->cfdata_index-1) * 0x8000);
1749
1750	d = cab->uncompressed_buffer + cfdata->read_offset;
1751	*avail = uavail - cfdata->read_offset;
1752	cfdata->uncompressed_avail = uavail;
1753
1754	return (d);
1755}
1756
1757/*
1758 * Consume CFDATA.
1759 * We always decompress CFDATA to consume CFDATA as much as we need
1760 * in uncompressed bytes because all CFDATA in a folder are related
1761 * so we do not skip any CFDATA without decompressing.
1762 * Note: If the folder of a CFFILE is iFoldCONTINUED_PREV_AND_NEXT or
1763 * iFoldCONTINUED_FROM_PREV, we won't decompress because a CFDATA for
1764 * the CFFILE is remaining bytes of previous Multivolume CAB file.
1765 */
1766static int64_t
1767cab_consume_cfdata(struct archive_read *a, int64_t consumed_bytes)
1768{
1769	struct cab *cab = (struct cab *)(a->format->data);
1770	struct cfdata *cfdata;
1771	int64_t cbytes, rbytes;
1772	int err;
1773
1774	rbytes = cab_minimum_consume_cfdata(a, consumed_bytes);
1775	if (rbytes < 0)
1776		return (ARCHIVE_FATAL);
1777
1778	cfdata = cab->entry_cfdata;
1779	while (rbytes > 0) {
1780		ssize_t avail;
1781
1782		if (cfdata->compressed_size == 0) {
1783			archive_set_error(&a->archive,
1784			    ARCHIVE_ERRNO_FILE_FORMAT,
1785			    "Invalid CFDATA");
1786			return (ARCHIVE_FATAL);
1787		}
1788		cbytes = cfdata->uncompressed_bytes_remaining;
1789		if (cbytes > rbytes)
1790			cbytes = rbytes;
1791		rbytes -= cbytes;
1792
1793		if (cfdata->uncompressed_avail == 0 &&
1794		   (cab->entry_cffile->folder == iFoldCONTINUED_PREV_AND_NEXT ||
1795		    cab->entry_cffile->folder == iFoldCONTINUED_FROM_PREV)) {
1796			/* We have not read any data yet. */
1797			if (cbytes == cfdata->uncompressed_bytes_remaining) {
1798				/* Skip whole current CFDATA. */
1799				__archive_read_consume(a,
1800				    cfdata->compressed_size);
1801				cab->cab_offset += cfdata->compressed_size;
1802				cfdata->compressed_bytes_remaining = 0;
1803				cfdata->uncompressed_bytes_remaining = 0;
1804				err = cab_next_cfdata(a);
1805				if (err < 0)
1806					return (err);
1807				cfdata = cab->entry_cfdata;
1808				if (cfdata->uncompressed_size == 0) {
1809					switch (cab->entry_cffile->folder) {
1810					case iFoldCONTINUED_PREV_AND_NEXT:
1811					case iFoldCONTINUED_TO_NEXT:
1812					case iFoldCONTINUED_FROM_PREV:
1813						rbytes = 0;
1814						break;
1815					default:
1816						break;
1817					}
1818				}
1819				continue;
1820			}
1821			cfdata->read_offset += (uint16_t)cbytes;
1822			cfdata->uncompressed_bytes_remaining -= (uint16_t)cbytes;
1823			break;
1824		} else if (cbytes == 0) {
1825			err = cab_next_cfdata(a);
1826			if (err < 0)
1827				return (err);
1828			cfdata = cab->entry_cfdata;
1829			if (cfdata->uncompressed_size == 0) {
1830				switch (cab->entry_cffile->folder) {
1831				case iFoldCONTINUED_PREV_AND_NEXT:
1832				case iFoldCONTINUED_TO_NEXT:
1833				case iFoldCONTINUED_FROM_PREV:
1834					return (ARCHIVE_FATAL);
1835				default:
1836					break;
1837				}
1838			}
1839			continue;
1840		}
1841		while (cbytes > 0) {
1842			(void)cab_read_ahead_cfdata(a, &avail);
1843			if (avail <= 0)
1844				return (ARCHIVE_FATAL);
1845			if (avail > cbytes)
1846				avail = (ssize_t)cbytes;
1847			if (cab_minimum_consume_cfdata(a, avail) < 0)
1848				return (ARCHIVE_FATAL);
1849			cbytes -= avail;
1850		}
1851	}
1852	return (consumed_bytes);
1853}
1854
1855/*
1856 * Consume CFDATA as much as we have already gotten and
1857 * compute the sum of CFDATA.
1858 */
1859static int64_t
1860cab_minimum_consume_cfdata(struct archive_read *a, int64_t consumed_bytes)
1861{
1862	struct cab *cab = (struct cab *)(a->format->data);
1863	struct cfdata *cfdata;
1864	int64_t cbytes, rbytes;
1865	int err;
1866
1867	cfdata = cab->entry_cfdata;
1868	rbytes = consumed_bytes;
1869	if (cab->entry_cffolder->comptype == COMPTYPE_NONE) {
1870		if (consumed_bytes < cfdata->unconsumed)
1871			cbytes = consumed_bytes;
1872		else
1873			cbytes = cfdata->unconsumed;
1874		rbytes -= cbytes;
1875		cfdata->read_offset += (uint16_t)cbytes;
1876		cfdata->uncompressed_bytes_remaining -= (uint16_t)cbytes;
1877		cfdata->unconsumed -= cbytes;
1878	} else {
1879		cbytes = cfdata->uncompressed_avail - cfdata->read_offset;
1880		if (cbytes > 0) {
1881			if (consumed_bytes < cbytes)
1882				cbytes = consumed_bytes;
1883			rbytes -= cbytes;
1884			cfdata->read_offset += (uint16_t)cbytes;
1885			cfdata->uncompressed_bytes_remaining -= (uint16_t)cbytes;
1886		}
1887
1888		if (cfdata->unconsumed) {
1889			cbytes = cfdata->unconsumed;
1890			cfdata->unconsumed = 0;
1891		} else
1892			cbytes = 0;
1893	}
1894	if (cbytes) {
1895		/* Compute the sum. */
1896		cab_checksum_update(a, (size_t)cbytes);
1897
1898		/* Consume as much as the compressor actually used. */
1899		__archive_read_consume(a, cbytes);
1900		cab->cab_offset += cbytes;
1901		cfdata->compressed_bytes_remaining -= (uint16_t)cbytes;
1902		if (cfdata->compressed_bytes_remaining == 0) {
1903			err = cab_checksum_finish(a);
1904			if (err < 0)
1905				return (err);
1906		}
1907	}
1908	return (rbytes);
1909}
1910
1911/*
1912 * Returns ARCHIVE_OK if successful, ARCHIVE_FATAL otherwise, sets
1913 * cab->end_of_entry if it consumes all of the data.
1914 */
1915static int
1916cab_read_data(struct archive_read *a, const void **buff,
1917    size_t *size, int64_t *offset)
1918{
1919	struct cab *cab = (struct cab *)(a->format->data);
1920	ssize_t bytes_avail;
1921
1922	if (cab->entry_bytes_remaining == 0) {
1923		*buff = NULL;
1924		*size = 0;
1925		*offset = cab->entry_offset;
1926		cab->end_of_entry = 1;
1927		return (ARCHIVE_OK);
1928	}
1929
1930	*buff = cab_read_ahead_cfdata(a, &bytes_avail);
1931	if (bytes_avail <= 0) {
1932		*buff = NULL;
1933		*size = 0;
1934		*offset = 0;
1935		if (bytes_avail == 0 &&
1936		    cab->entry_cfdata->uncompressed_size == 0) {
1937			/* All of CFDATA in a folder has been handled. */
1938			archive_set_error(&a->archive,
1939			    ARCHIVE_ERRNO_FILE_FORMAT, "Invalid CFDATA");
1940			return (ARCHIVE_FATAL);
1941		} else
1942			return ((int)bytes_avail);
1943	}
1944	if (bytes_avail > cab->entry_bytes_remaining)
1945		bytes_avail = (ssize_t)cab->entry_bytes_remaining;
1946
1947	*size = bytes_avail;
1948	*offset = cab->entry_offset;
1949	cab->entry_offset += bytes_avail;
1950	cab->entry_bytes_remaining -= bytes_avail;
1951	if (cab->entry_bytes_remaining == 0)
1952		cab->end_of_entry = 1;
1953	cab->entry_unconsumed = bytes_avail;
1954	if (cab->entry_cffolder->comptype == COMPTYPE_NONE) {
1955		/* Don't consume more than current entry used. */
1956		if (cab->entry_cfdata->unconsumed > cab->entry_unconsumed)
1957			cab->entry_cfdata->unconsumed = cab->entry_unconsumed;
1958	}
1959	return (ARCHIVE_OK);
1960}
1961
1962static int
1963archive_read_format_cab_read_data_skip(struct archive_read *a)
1964{
1965	struct cab *cab;
1966	int64_t bytes_skipped;
1967	int r;
1968
1969	cab = (struct cab *)(a->format->data);
1970
1971	if (cab->end_of_archive)
1972		return (ARCHIVE_EOF);
1973
1974	if (!cab->read_data_invoked) {
1975		cab->bytes_skipped += cab->entry_bytes_remaining;
1976		cab->entry_bytes_remaining = 0;
1977		/* This entry is finished and done. */
1978		cab->end_of_entry_cleanup = cab->end_of_entry = 1;
1979		return (ARCHIVE_OK);
1980	}
1981
1982	if (cab->entry_unconsumed) {
1983		/* Consume as much as the compressor actually used. */
1984		r = (int)cab_consume_cfdata(a, cab->entry_unconsumed);
1985		cab->entry_unconsumed = 0;
1986		if (r < 0)
1987			return (r);
1988	} else if (cab->entry_cfdata == NULL) {
1989		r = cab_next_cfdata(a);
1990		if (r < 0)
1991			return (r);
1992	}
1993
1994	/* if we've already read to end of data, we're done. */
1995	if (cab->end_of_entry_cleanup)
1996		return (ARCHIVE_OK);
1997
1998	/*
1999	 * If the length is at the beginning, we can skip the
2000	 * compressed data much more quickly.
2001	 */
2002	bytes_skipped = cab_consume_cfdata(a, cab->entry_bytes_remaining);
2003	if (bytes_skipped < 0)
2004		return (ARCHIVE_FATAL);
2005
2006	/* If the compression type is none(uncompressed), we've already
2007	 * consumed data as much as the current entry size. */
2008	if (cab->entry_cffolder->comptype == COMPTYPE_NONE &&
2009	    cab->entry_cfdata != NULL)
2010		cab->entry_cfdata->unconsumed = 0;
2011
2012	/* This entry is finished and done. */
2013	cab->end_of_entry_cleanup = cab->end_of_entry = 1;
2014	return (ARCHIVE_OK);
2015}
2016
2017static int
2018archive_read_format_cab_cleanup(struct archive_read *a)
2019{
2020	struct cab *cab = (struct cab *)(a->format->data);
2021	struct cfheader *hd = &cab->cfheader;
2022	int i;
2023
2024	if (hd->folder_array != NULL) {
2025		for (i = 0; i < hd->folder_count; i++)
2026			free(hd->folder_array[i].cfdata.memimage);
2027		free(hd->folder_array);
2028	}
2029	if (hd->file_array != NULL) {
2030		for (i = 0; i < cab->cfheader.file_count; i++)
2031			archive_string_free(&(hd->file_array[i].pathname));
2032		free(hd->file_array);
2033	}
2034#ifdef HAVE_ZLIB_H
2035	if (cab->stream_valid)
2036		inflateEnd(&cab->stream);
2037#endif
2038	lzx_decode_free(&cab->xstrm);
2039	archive_wstring_free(&cab->ws);
2040	free(cab->uncompressed_buffer);
2041	free(cab);
2042	(a->format->data) = NULL;
2043	return (ARCHIVE_OK);
2044}
2045
2046/* Convert an MSDOS-style date/time into Unix-style time. */
2047static time_t
2048cab_dos_time(const unsigned char *p)
2049{
2050	int msTime, msDate;
2051	struct tm ts;
2052
2053	msDate = archive_le16dec(p);
2054	msTime = archive_le16dec(p+2);
2055
2056	memset(&ts, 0, sizeof(ts));
2057	ts.tm_year = ((msDate >> 9) & 0x7f) + 80;   /* Years since 1900. */
2058	ts.tm_mon = ((msDate >> 5) & 0x0f) - 1;     /* Month number.     */
2059	ts.tm_mday = msDate & 0x1f;		    /* Day of month.     */
2060	ts.tm_hour = (msTime >> 11) & 0x1f;
2061	ts.tm_min = (msTime >> 5) & 0x3f;
2062	ts.tm_sec = (msTime << 1) & 0x3e;
2063	ts.tm_isdst = -1;
2064	return (mktime(&ts));
2065}
2066
2067/*****************************************************************
2068 *
2069 * LZX decompression code.
2070 *
2071 *****************************************************************/
2072
2073/*
2074 * Initialize LZX decoder.
2075 *
2076 * Returns ARCHIVE_OK if initialization was successful.
2077 * Returns ARCHIVE_FAILED if w_bits has unsupported value.
2078 * Returns ARCHIVE_FATAL if initialization failed; memory allocation
2079 * error occurred.
2080 */
2081static int
2082lzx_decode_init(struct lzx_stream *strm, int w_bits)
2083{
2084	struct lzx_dec *ds;
2085	int slot, w_size, w_slot;
2086	int base, footer;
2087	int base_inc[18];
2088
2089	if (strm->ds == NULL) {
2090		strm->ds = calloc(1, sizeof(*strm->ds));
2091		if (strm->ds == NULL)
2092			return (ARCHIVE_FATAL);
2093	}
2094	ds = strm->ds;
2095	ds->error = ARCHIVE_FAILED;
2096
2097	/* Allow bits from 15(32KBi) up to 21(2MBi) */
2098	if (w_bits < SLOT_BASE || w_bits > SLOT_MAX)
2099		return (ARCHIVE_FAILED);
2100
2101	ds->error = ARCHIVE_FATAL;
2102
2103	/*
2104	 * Alloc window
2105	 */
2106	w_size = ds->w_size;
2107	w_slot = slots[w_bits - SLOT_BASE];
2108	ds->w_size = 1U << w_bits;
2109	ds->w_mask = ds->w_size -1;
2110	if (ds->w_buff == NULL || w_size != ds->w_size) {
2111		free(ds->w_buff);
2112		ds->w_buff = malloc(ds->w_size);
2113		if (ds->w_buff == NULL)
2114			return (ARCHIVE_FATAL);
2115		free(ds->pos_tbl);
2116		ds->pos_tbl = malloc(sizeof(ds->pos_tbl[0]) * w_slot);
2117		if (ds->pos_tbl == NULL)
2118			return (ARCHIVE_FATAL);
2119		lzx_huffman_free(&(ds->mt));
2120	}
2121
2122	for (footer = 0; footer < 18; footer++)
2123		base_inc[footer] = 1 << footer;
2124	base = footer = 0;
2125	for (slot = 0; slot < w_slot; slot++) {
2126		int n;
2127		if (footer == 0)
2128			base = slot;
2129		else
2130			base += base_inc[footer];
2131		if (footer < 17) {
2132			footer = -2;
2133			for (n = base; n; n >>= 1)
2134				footer++;
2135			if (footer <= 0)
2136				footer = 0;
2137		}
2138		ds->pos_tbl[slot].base = base;
2139		ds->pos_tbl[slot].footer_bits = footer;
2140	}
2141
2142	ds->w_pos = 0;
2143	ds->state = 0;
2144	ds->br.cache_buffer = 0;
2145	ds->br.cache_avail = 0;
2146	ds->r0 = ds->r1 = ds->r2 = 1;
2147
2148	/* Initialize aligned offset tree. */
2149	if (lzx_huffman_init(&(ds->at), 8, 8) != ARCHIVE_OK)
2150		return (ARCHIVE_FATAL);
2151
2152	/* Initialize pre-tree. */
2153	if (lzx_huffman_init(&(ds->pt), 20, 10) != ARCHIVE_OK)
2154		return (ARCHIVE_FATAL);
2155
2156	/* Initialize Main tree. */
2157	if (lzx_huffman_init(&(ds->mt), 256+(w_slot<<3), 16)
2158	    != ARCHIVE_OK)
2159		return (ARCHIVE_FATAL);
2160
2161	/* Initialize Length tree. */
2162	if (lzx_huffman_init(&(ds->lt), 249, 16) != ARCHIVE_OK)
2163		return (ARCHIVE_FATAL);
2164
2165	ds->error = 0;
2166
2167	return (ARCHIVE_OK);
2168}
2169
2170/*
2171 * Release LZX decoder.
2172 */
2173static void
2174lzx_decode_free(struct lzx_stream *strm)
2175{
2176
2177	if (strm->ds == NULL)
2178		return;
2179	free(strm->ds->w_buff);
2180	free(strm->ds->pos_tbl);
2181	lzx_huffman_free(&(strm->ds->at));
2182	lzx_huffman_free(&(strm->ds->pt));
2183	lzx_huffman_free(&(strm->ds->mt));
2184	lzx_huffman_free(&(strm->ds->lt));
2185	free(strm->ds);
2186	strm->ds = NULL;
2187}
2188
2189/*
2190 * E8 Call Translation reversal.
2191 */
2192static void
2193lzx_translation(struct lzx_stream *strm, void *p, size_t size, uint32_t offset)
2194{
2195	struct lzx_dec *ds = strm->ds;
2196	unsigned char *b, *end;
2197
2198	if (!ds->translation || size <= 10)
2199		return;
2200	b = p;
2201	end = b + size - 10;
2202	while (b < end && (b = memchr(b, 0xE8, end - b)) != NULL) {
2203		size_t i = b - (unsigned char *)p;
2204		int32_t cp, displacement, value;
2205
2206		cp = (int32_t)(offset + (uint32_t)i);
2207		value = archive_le32dec(&b[1]);
2208		if (value >= -cp && value < (int32_t)ds->translation_size) {
2209			if (value >= 0)
2210				displacement = value - cp;
2211			else
2212				displacement = value + ds->translation_size;
2213			archive_le32enc(&b[1], (uint32_t)displacement);
2214		}
2215		b += 5;
2216	}
2217}
2218
2219/*
2220 * Bit stream reader.
2221 */
2222/* Check that the cache buffer has enough bits. */
2223#define lzx_br_has(br, n)	((br)->cache_avail >= n)
2224/* Get compressed data by bit. */
2225#define lzx_br_bits(br, n)				\
2226	(((uint32_t)((br)->cache_buffer >>		\
2227		((br)->cache_avail - (n)))) & cache_masks[n])
2228#define lzx_br_bits_forced(br, n)			\
2229	(((uint32_t)((br)->cache_buffer <<		\
2230		((n) - (br)->cache_avail))) & cache_masks[n])
2231/* Read ahead to make sure the cache buffer has enough compressed data we
2232 * will use.
2233 *  True  : completed, there is enough data in the cache buffer.
2234 *  False : we met that strm->next_in is empty, we have to get following
2235 *          bytes. */
2236#define lzx_br_read_ahead_0(strm, br, n)	\
2237	(lzx_br_has((br), (n)) || lzx_br_fillup(strm, br))
2238/*  True  : the cache buffer has some bits as much as we need.
2239 *  False : there are no enough bits in the cache buffer to be used,
2240 *          we have to get following bytes if we could. */
2241#define lzx_br_read_ahead(strm, br, n)	\
2242	(lzx_br_read_ahead_0((strm), (br), (n)) || lzx_br_has((br), (n)))
2243
2244/* Notify how many bits we consumed. */
2245#define lzx_br_consume(br, n)	((br)->cache_avail -= (n))
2246#define lzx_br_consume_unaligned_bits(br) ((br)->cache_avail &= ~0x0f)
2247
2248#define lzx_br_is_unaligned(br)	((br)->cache_avail & 0x0f)
2249
2250static const uint32_t cache_masks[] = {
2251	0x00000000, 0x00000001, 0x00000003, 0x00000007,
2252	0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F,
2253	0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
2254	0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
2255	0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF,
2256	0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
2257	0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF,
2258	0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
2259	0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
2260};
2261
2262/*
2263 * Shift away used bits in the cache data and fill it up with following bits.
2264 * Call this when cache buffer does not have enough bits you need.
2265 *
2266 * Returns 1 if the cache buffer is full.
2267 * Returns 0 if the cache buffer is not full; input buffer is empty.
2268 */
2269static int
2270lzx_br_fillup(struct lzx_stream *strm, struct lzx_br *br)
2271{
2272/*
2273 * x86 proccessor family can read misaligned data without an access error.
2274 */
2275	int n = CACHE_BITS - br->cache_avail;
2276
2277	for (;;) {
2278		switch (n >> 4) {
2279		case 4:
2280			if (strm->avail_in >= 8) {
2281				br->cache_buffer =
2282				    ((uint64_t)strm->next_in[1]) << 56 |
2283				    ((uint64_t)strm->next_in[0]) << 48 |
2284				    ((uint64_t)strm->next_in[3]) << 40 |
2285				    ((uint64_t)strm->next_in[2]) << 32 |
2286				    ((uint32_t)strm->next_in[5]) << 24 |
2287				    ((uint32_t)strm->next_in[4]) << 16 |
2288				    ((uint32_t)strm->next_in[7]) << 8 |
2289				     (uint32_t)strm->next_in[6];
2290				strm->next_in += 8;
2291				strm->avail_in -= 8;
2292				br->cache_avail += 8 * 8;
2293				return (1);
2294			}
2295			break;
2296		case 3:
2297			if (strm->avail_in >= 6) {
2298				br->cache_buffer =
2299		 		   (br->cache_buffer << 48) |
2300				    ((uint64_t)strm->next_in[1]) << 40 |
2301				    ((uint64_t)strm->next_in[0]) << 32 |
2302				    ((uint32_t)strm->next_in[3]) << 24 |
2303				    ((uint32_t)strm->next_in[2]) << 16 |
2304				    ((uint32_t)strm->next_in[5]) << 8 |
2305				     (uint32_t)strm->next_in[4];
2306				strm->next_in += 6;
2307				strm->avail_in -= 6;
2308				br->cache_avail += 6 * 8;
2309				return (1);
2310			}
2311			break;
2312		case 0:
2313			/* We have enough compressed data in
2314			 * the cache buffer.*/
2315			return (1);
2316		default:
2317			break;
2318		}
2319		if (strm->avail_in < 2) {
2320			/* There is not enough compressed data to
2321			 * fill up the cache buffer. */
2322			if (strm->avail_in == 1) {
2323				br->odd = *strm->next_in++;
2324				strm->avail_in--;
2325				br->have_odd = 1;
2326			}
2327			return (0);
2328		}
2329		br->cache_buffer =
2330		   (br->cache_buffer << 16) |
2331		    archive_le16dec(strm->next_in);
2332		strm->next_in += 2;
2333		strm->avail_in -= 2;
2334		br->cache_avail += 16;
2335		n -= 16;
2336	}
2337}
2338
2339static void
2340lzx_br_fixup(struct lzx_stream *strm, struct lzx_br *br)
2341{
2342	int n = CACHE_BITS - br->cache_avail;
2343
2344	if (br->have_odd && n >= 16 && strm->avail_in > 0) {
2345		br->cache_buffer =
2346		   (br->cache_buffer << 16) |
2347		   ((uint16_t)(*strm->next_in)) << 8 | br->odd;
2348		strm->next_in++;
2349		strm->avail_in--;
2350		br->cache_avail += 16;
2351		br->have_odd = 0;
2352	}
2353}
2354
2355static void
2356lzx_cleanup_bitstream(struct lzx_stream *strm)
2357{
2358	strm->ds->br.cache_avail = 0;
2359	strm->ds->br.have_odd = 0;
2360}
2361
2362/*
2363 * Decode LZX.
2364 *
2365 * 1. Returns ARCHIVE_OK if output buffer or input buffer are empty.
2366 *    Please set available buffer and call this function again.
2367 * 2. Returns ARCHIVE_EOF if decompression has been completed.
2368 * 3. Returns ARCHIVE_FAILED if an error occurred; compressed data
2369 *    is broken or you do not set 'last' flag properly.
2370 */
2371#define ST_RD_TRANSLATION	0
2372#define ST_RD_TRANSLATION_SIZE	1
2373#define ST_RD_BLOCK_TYPE	2
2374#define ST_RD_BLOCK_SIZE	3
2375#define ST_RD_ALIGNMENT		4
2376#define ST_RD_R0		5
2377#define ST_RD_R1		6
2378#define ST_RD_R2		7
2379#define ST_COPY_UNCOMP1		8
2380#define ST_COPY_UNCOMP2		9
2381#define ST_RD_ALIGNED_OFFSET	10
2382#define ST_RD_VERBATIM		11
2383#define ST_RD_PRE_MAIN_TREE_256	12
2384#define ST_MAIN_TREE_256	13
2385#define ST_RD_PRE_MAIN_TREE_REM	14
2386#define ST_MAIN_TREE_REM	15
2387#define ST_RD_PRE_LENGTH_TREE	16
2388#define ST_LENGTH_TREE		17
2389#define ST_MAIN			18
2390#define ST_LENGTH		19
2391#define ST_OFFSET		20
2392#define ST_REAL_POS		21
2393#define ST_COPY			22
2394
2395static int
2396lzx_decode(struct lzx_stream *strm, int last)
2397{
2398	struct lzx_dec *ds = strm->ds;
2399	int64_t avail_in;
2400	int r;
2401
2402	if (ds->error)
2403		return (ds->error);
2404
2405	avail_in = strm->avail_in;
2406	lzx_br_fixup(strm, &(ds->br));
2407	do {
2408		if (ds->state < ST_MAIN)
2409			r = lzx_read_blocks(strm, last);
2410		else {
2411			int64_t bytes_written = strm->avail_out;
2412			r = lzx_decode_blocks(strm, last);
2413			bytes_written -= strm->avail_out;
2414			strm->next_out += bytes_written;
2415			strm->total_out += bytes_written;
2416		}
2417	} while (r == 100);
2418	strm->total_in += avail_in - strm->avail_in;
2419	return (r);
2420}
2421
2422static int
2423lzx_read_blocks(struct lzx_stream *strm, int last)
2424{
2425	struct lzx_dec *ds = strm->ds;
2426	struct lzx_br *br = &(ds->br);
2427	int i, r;
2428
2429	for (;;) {
2430		switch (ds->state) {
2431		case ST_RD_TRANSLATION:
2432			if (!lzx_br_read_ahead(strm, br, 1)) {
2433				ds->state = ST_RD_TRANSLATION;
2434				if (last)
2435					goto failed;
2436				return (ARCHIVE_OK);
2437			}
2438			ds->translation = lzx_br_bits(br, 1);
2439			lzx_br_consume(br, 1);
2440			/* FALL THROUGH */
2441		case ST_RD_TRANSLATION_SIZE:
2442			if (ds->translation) {
2443				if (!lzx_br_read_ahead(strm, br, 32)) {
2444					ds->state = ST_RD_TRANSLATION_SIZE;
2445					if (last)
2446						goto failed;
2447					return (ARCHIVE_OK);
2448				}
2449				ds->translation_size = lzx_br_bits(br, 16);
2450				lzx_br_consume(br, 16);
2451				ds->translation_size <<= 16;
2452				ds->translation_size |= lzx_br_bits(br, 16);
2453				lzx_br_consume(br, 16);
2454			}
2455			/* FALL THROUGH */
2456		case ST_RD_BLOCK_TYPE:
2457			if (!lzx_br_read_ahead(strm, br, 3)) {
2458				ds->state = ST_RD_BLOCK_TYPE;
2459				if (last)
2460					goto failed;
2461				return (ARCHIVE_OK);
2462			}
2463			ds->block_type = lzx_br_bits(br, 3);
2464			lzx_br_consume(br, 3);
2465			/* Check a block type. */
2466			switch (ds->block_type) {
2467			case VERBATIM_BLOCK:
2468			case ALIGNED_OFFSET_BLOCK:
2469			case UNCOMPRESSED_BLOCK:
2470				break;
2471			default:
2472				goto failed;/* Invalid */
2473			}
2474			/* FALL THROUGH */
2475		case ST_RD_BLOCK_SIZE:
2476			if (!lzx_br_read_ahead(strm, br, 24)) {
2477				ds->state = ST_RD_BLOCK_SIZE;
2478				if (last)
2479					goto failed;
2480				return (ARCHIVE_OK);
2481			}
2482			ds->block_size = lzx_br_bits(br, 8);
2483			lzx_br_consume(br, 8);
2484			ds->block_size <<= 16;
2485			ds->block_size |= lzx_br_bits(br, 16);
2486			lzx_br_consume(br, 16);
2487			if (ds->block_size == 0)
2488				goto failed;
2489			ds->block_bytes_avail = ds->block_size;
2490			if (ds->block_type != UNCOMPRESSED_BLOCK) {
2491				if (ds->block_type == VERBATIM_BLOCK)
2492					ds->state = ST_RD_VERBATIM;
2493				else
2494					ds->state = ST_RD_ALIGNED_OFFSET;
2495				break;
2496			}
2497			/* FALL THROUGH */
2498		case ST_RD_ALIGNMENT:
2499			/*
2500			 * Handle an Uncompressed Block.
2501			 */
2502			/* Skip padding to align following field on
2503			 * 16-bit boundary. */
2504			if (lzx_br_is_unaligned(br))
2505				lzx_br_consume_unaligned_bits(br);
2506			else {
2507				if (lzx_br_read_ahead(strm, br, 16))
2508					lzx_br_consume(br, 16);
2509				else {
2510					ds->state = ST_RD_ALIGNMENT;
2511					if (last)
2512						goto failed;
2513					return (ARCHIVE_OK);
2514				}
2515			}
2516			/* Preparation to read repeated offsets R0,R1 and R2. */
2517			ds->rbytes_avail = 0;
2518			ds->state = ST_RD_R0;
2519			/* FALL THROUGH */
2520		case ST_RD_R0:
2521		case ST_RD_R1:
2522		case ST_RD_R2:
2523			do {
2524				uint16_t u16;
2525				/* Drain bits in the cache buffer of
2526				 * bit-stream. */
2527				if (lzx_br_has(br, 32)) {
2528					u16 = lzx_br_bits(br, 16);
2529					lzx_br_consume(br, 16);
2530					archive_le16enc(ds->rbytes, u16);
2531					u16 = lzx_br_bits(br, 16);
2532					lzx_br_consume(br, 16);
2533					archive_le16enc(ds->rbytes+2, u16);
2534					ds->rbytes_avail = 4;
2535				} else if (lzx_br_has(br, 16)) {
2536					u16 = lzx_br_bits(br, 16);
2537					lzx_br_consume(br, 16);
2538					archive_le16enc(ds->rbytes, u16);
2539					ds->rbytes_avail = 2;
2540				}
2541				if (ds->rbytes_avail < 4 && ds->br.have_odd) {
2542					ds->rbytes[ds->rbytes_avail++] =
2543					    ds->br.odd;
2544					ds->br.have_odd = 0;
2545				}
2546				while (ds->rbytes_avail < 4) {
2547					if (strm->avail_in <= 0) {
2548						if (last)
2549							goto failed;
2550						return (ARCHIVE_OK);
2551					}
2552					ds->rbytes[ds->rbytes_avail++] =
2553					    *strm->next_in++;
2554					strm->avail_in--;
2555				}
2556				ds->rbytes_avail = 0;
2557				if (ds->state == ST_RD_R0) {
2558					ds->r0 = archive_le32dec(ds->rbytes);
2559					if (ds->r0 < 0)
2560						goto failed;
2561					ds->state = ST_RD_R1;
2562				} else if (ds->state == ST_RD_R1) {
2563					ds->r1 = archive_le32dec(ds->rbytes);
2564					if (ds->r1 < 0)
2565						goto failed;
2566					ds->state = ST_RD_R2;
2567				} else if (ds->state == ST_RD_R2) {
2568					ds->r2 = archive_le32dec(ds->rbytes);
2569					if (ds->r2 < 0)
2570						goto failed;
2571					/* We've gotten all repeated offsets. */
2572					ds->state = ST_COPY_UNCOMP1;
2573				}
2574			} while (ds->state != ST_COPY_UNCOMP1);
2575			/* FALL THROUGH */
2576		case ST_COPY_UNCOMP1:
2577			/*
2578			 * Copy bytes form next_in to next_out directly.
2579			 */
2580			while (ds->block_bytes_avail) {
2581				int l;
2582
2583				if (strm->avail_out <= 0)
2584					/* Output buffer is empty. */
2585					return (ARCHIVE_OK);
2586				if (strm->avail_in <= 0) {
2587					/* Input buffer is empty. */
2588					if (last)
2589						goto failed;
2590					return (ARCHIVE_OK);
2591				}
2592				l = (int)ds->block_bytes_avail;
2593				if (l > ds->w_size - ds->w_pos)
2594					l = ds->w_size - ds->w_pos;
2595				if (l > strm->avail_out)
2596					l = (int)strm->avail_out;
2597				if (l > strm->avail_in)
2598					l = (int)strm->avail_in;
2599				memcpy(strm->next_out, strm->next_in, l);
2600				memcpy(&(ds->w_buff[ds->w_pos]),
2601				    strm->next_in, l);
2602				strm->next_in += l;
2603				strm->avail_in -= l;
2604				strm->next_out += l;
2605				strm->avail_out -= l;
2606				strm->total_out += l;
2607				ds->w_pos = (ds->w_pos + l) & ds->w_mask;
2608				ds->block_bytes_avail -= l;
2609			}
2610			/* FALL THROUGH */
2611		case ST_COPY_UNCOMP2:
2612			/* Re-align; skip padding byte. */
2613			if (ds->block_size & 1) {
2614				if (strm->avail_in <= 0) {
2615					/* Input buffer is empty. */
2616					ds->state = ST_COPY_UNCOMP2;
2617					if (last)
2618						goto failed;
2619					return (ARCHIVE_OK);
2620				}
2621				strm->next_in++;
2622				strm->avail_in --;
2623			}
2624			/* This block ended. */
2625			ds->state = ST_RD_BLOCK_TYPE;
2626			return (ARCHIVE_EOF);
2627			/********************/
2628		case ST_RD_ALIGNED_OFFSET:
2629			/*
2630			 * Read Aligned offset tree.
2631			 */
2632			if (!lzx_br_read_ahead(strm, br, 3 * ds->at.len_size)) {
2633				ds->state = ST_RD_ALIGNED_OFFSET;
2634				if (last)
2635					goto failed;
2636				return (ARCHIVE_OK);
2637			}
2638			memset(ds->at.freq, 0, sizeof(ds->at.freq));
2639			for (i = 0; i < ds->at.len_size; i++) {
2640				ds->at.bitlen[i] = lzx_br_bits(br, 3);
2641				ds->at.freq[ds->at.bitlen[i]]++;
2642				lzx_br_consume(br, 3);
2643			}
2644			if (!lzx_make_huffman_table(&ds->at))
2645				goto failed;
2646			/* FALL THROUGH */
2647		case ST_RD_VERBATIM:
2648			ds->loop = 0;
2649			/* FALL THROUGH */
2650		case ST_RD_PRE_MAIN_TREE_256:
2651			/*
2652			 * Read Pre-tree for first 256 elements of main tree.
2653			 */
2654			if (!lzx_read_pre_tree(strm)) {
2655				ds->state = ST_RD_PRE_MAIN_TREE_256;
2656				if (last)
2657					goto failed;
2658				return (ARCHIVE_OK);
2659			}
2660			if (!lzx_make_huffman_table(&ds->pt))
2661				goto failed;
2662			ds->loop = 0;
2663			/* FALL THROUGH */
2664		case ST_MAIN_TREE_256:
2665			/*
2666			 * Get path lengths of first 256 elements of main tree.
2667			 */
2668			r = lzx_read_bitlen(strm, &ds->mt, 256);
2669			if (r < 0)
2670				goto failed;
2671			else if (!r) {
2672				ds->state = ST_MAIN_TREE_256;
2673				if (last)
2674					goto failed;
2675				return (ARCHIVE_OK);
2676			}
2677			ds->loop = 0;
2678			/* FALL THROUGH */
2679		case ST_RD_PRE_MAIN_TREE_REM:
2680			/*
2681			 * Read Pre-tree for remaining elements of main tree.
2682			 */
2683			if (!lzx_read_pre_tree(strm)) {
2684				ds->state = ST_RD_PRE_MAIN_TREE_REM;
2685				if (last)
2686					goto failed;
2687				return (ARCHIVE_OK);
2688			}
2689			if (!lzx_make_huffman_table(&ds->pt))
2690				goto failed;
2691			ds->loop = 256;
2692			/* FALL THROUGH */
2693		case ST_MAIN_TREE_REM:
2694			/*
2695			 * Get path lengths of remaining elements of main tree.
2696			 */
2697			r = lzx_read_bitlen(strm, &ds->mt, -1);
2698			if (r < 0)
2699				goto failed;
2700			else if (!r) {
2701				ds->state = ST_MAIN_TREE_REM;
2702				if (last)
2703					goto failed;
2704				return (ARCHIVE_OK);
2705			}
2706			if (!lzx_make_huffman_table(&ds->mt))
2707				goto failed;
2708			ds->loop = 0;
2709			/* FALL THROUGH */
2710		case ST_RD_PRE_LENGTH_TREE:
2711			/*
2712			 * Read Pre-tree for remaining elements of main tree.
2713			 */
2714			if (!lzx_read_pre_tree(strm)) {
2715				ds->state = ST_RD_PRE_LENGTH_TREE;
2716				if (last)
2717					goto failed;
2718				return (ARCHIVE_OK);
2719			}
2720			if (!lzx_make_huffman_table(&ds->pt))
2721				goto failed;
2722			ds->loop = 0;
2723			/* FALL THROUGH */
2724		case ST_LENGTH_TREE:
2725			/*
2726			 * Get path lengths of remaining elements of main tree.
2727			 */
2728			r = lzx_read_bitlen(strm, &ds->lt, -1);
2729			if (r < 0)
2730				goto failed;
2731			else if (!r) {
2732				ds->state = ST_LENGTH_TREE;
2733				if (last)
2734					goto failed;
2735				return (ARCHIVE_OK);
2736			}
2737			if (!lzx_make_huffman_table(&ds->lt))
2738				goto failed;
2739			ds->state = ST_MAIN;
2740			return (100);
2741		}
2742	}
2743failed:
2744	return (ds->error = ARCHIVE_FAILED);
2745}
2746
2747static int
2748lzx_decode_blocks(struct lzx_stream *strm, int last)
2749{
2750	struct lzx_dec *ds = strm->ds;
2751	struct lzx_br bre = ds->br;
2752	struct huffman *at = &(ds->at), *lt = &(ds->lt), *mt = &(ds->mt);
2753	const struct lzx_pos_tbl *pos_tbl = ds->pos_tbl;
2754	unsigned char *noutp = strm->next_out;
2755	unsigned char *endp = noutp + strm->avail_out;
2756	unsigned char *w_buff = ds->w_buff;
2757	unsigned char *at_bitlen = at->bitlen;
2758	unsigned char *lt_bitlen = lt->bitlen;
2759	unsigned char *mt_bitlen = mt->bitlen;
2760	size_t block_bytes_avail = ds->block_bytes_avail;
2761	int at_max_bits = at->max_bits;
2762	int lt_max_bits = lt->max_bits;
2763	int mt_max_bits = mt->max_bits;
2764	int c, copy_len = ds->copy_len, copy_pos = ds->copy_pos;
2765	int w_pos = ds->w_pos, w_mask = ds->w_mask, w_size = ds->w_size;
2766	int length_header = ds->length_header;
2767	int offset_bits = ds->offset_bits;
2768	int position_slot = ds->position_slot;
2769	int r0 = ds->r0, r1 = ds->r1, r2 = ds->r2;
2770	int state = ds->state;
2771	char block_type = ds->block_type;
2772
2773	for (;;) {
2774		switch (state) {
2775		case ST_MAIN:
2776			for (;;) {
2777				if (block_bytes_avail == 0) {
2778					/* This block ended. */
2779					ds->state = ST_RD_BLOCK_TYPE;
2780					ds->br = bre;
2781					ds->block_bytes_avail =
2782					    block_bytes_avail;
2783					ds->copy_len = copy_len;
2784					ds->copy_pos = copy_pos;
2785					ds->length_header = length_header;
2786					ds->position_slot = position_slot;
2787					ds->r0 = r0; ds->r1 = r1; ds->r2 = r2;
2788					ds->w_pos = w_pos;
2789					strm->avail_out = endp - noutp;
2790					return (ARCHIVE_EOF);
2791				}
2792				if (noutp >= endp)
2793					/* Output buffer is empty. */
2794					goto next_data;
2795
2796				if (!lzx_br_read_ahead(strm, &bre,
2797				    mt_max_bits)) {
2798					if (!last)
2799						goto next_data;
2800					/* Remaining bits are less than
2801					 * maximum bits(mt.max_bits) but maybe
2802					 * it still remains as much as we need,
2803					 * so we should try to use it with
2804					 * dummy bits. */
2805					c = lzx_decode_huffman(mt,
2806					      lzx_br_bits_forced(
2807				 	        &bre, mt_max_bits));
2808					lzx_br_consume(&bre, mt_bitlen[c]);
2809					if (!lzx_br_has(&bre, 0))
2810						goto failed;/* Over read. */
2811				} else {
2812					c = lzx_decode_huffman(mt,
2813					      lzx_br_bits(&bre, mt_max_bits));
2814					lzx_br_consume(&bre, mt_bitlen[c]);
2815				}
2816				if (c > UCHAR_MAX)
2817					break;
2818				/*
2819				 * 'c' is exactly literal code.
2820				 */
2821				/* Save a decoded code to reference it
2822				 * afterward. */
2823				w_buff[w_pos] = c;
2824				w_pos = (w_pos + 1) & w_mask;
2825				/* Store the decoded code to output buffer. */
2826				*noutp++ = c;
2827				block_bytes_avail--;
2828			}
2829			/*
2830			 * Get a match code, its length and offset.
2831			 */
2832			c -= UCHAR_MAX + 1;
2833			length_header = c & 7;
2834			position_slot = c >> 3;
2835			/* FALL THROUGH */
2836		case ST_LENGTH:
2837			/*
2838			 * Get a length.
2839			 */
2840			if (length_header == 7) {
2841				if (!lzx_br_read_ahead(strm, &bre,
2842				    lt_max_bits)) {
2843					if (!last) {
2844						state = ST_LENGTH;
2845						goto next_data;
2846					}
2847					c = lzx_decode_huffman(lt,
2848					      lzx_br_bits_forced(
2849					        &bre, lt_max_bits));
2850					lzx_br_consume(&bre, lt_bitlen[c]);
2851					if (!lzx_br_has(&bre, 0))
2852						goto failed;/* Over read. */
2853				} else {
2854					c = lzx_decode_huffman(lt,
2855					    lzx_br_bits(&bre, lt_max_bits));
2856					lzx_br_consume(&bre, lt_bitlen[c]);
2857				}
2858				copy_len = c + 7 + 2;
2859			} else
2860				copy_len = length_header + 2;
2861			if ((size_t)copy_len > block_bytes_avail)
2862				goto failed;
2863			/*
2864			 * Get an offset.
2865			 */
2866			switch (position_slot) {
2867			case 0: /* Use repeated offset 0. */
2868				copy_pos = r0;
2869				state = ST_REAL_POS;
2870				continue;
2871			case 1: /* Use repeated offset 1. */
2872				copy_pos = r1;
2873				/* Swap repeated offset. */
2874				r1 = r0;
2875				r0 = copy_pos;
2876				state = ST_REAL_POS;
2877				continue;
2878			case 2: /* Use repeated offset 2. */
2879				copy_pos = r2;
2880				/* Swap repeated offset. */
2881				r2 = r0;
2882				r0 = copy_pos;
2883				state = ST_REAL_POS;
2884				continue;
2885			default:
2886				offset_bits =
2887				    pos_tbl[position_slot].footer_bits;
2888				break;
2889			}
2890			/* FALL THROUGH */
2891		case ST_OFFSET:
2892			/*
2893			 * Get the offset, which is a distance from
2894			 * current window position.
2895			 */
2896			if (block_type == ALIGNED_OFFSET_BLOCK &&
2897			    offset_bits >= 3) {
2898				int offbits = offset_bits - 3;
2899
2900				if (!lzx_br_read_ahead(strm, &bre, offbits)) {
2901					state = ST_OFFSET;
2902					if (last)
2903						goto failed;
2904					goto next_data;
2905				}
2906				copy_pos = lzx_br_bits(&bre, offbits) << 3;
2907
2908				/* Get an aligned number. */
2909				if (!lzx_br_read_ahead(strm, &bre,
2910				    offbits + at_max_bits)) {
2911					if (!last) {
2912						state = ST_OFFSET;
2913						goto next_data;
2914					}
2915					lzx_br_consume(&bre, offbits);
2916					c = lzx_decode_huffman(at,
2917					      lzx_br_bits_forced(&bre,
2918					        at_max_bits));
2919					lzx_br_consume(&bre, at_bitlen[c]);
2920					if (!lzx_br_has(&bre, 0))
2921						goto failed;/* Over read. */
2922				} else {
2923					lzx_br_consume(&bre, offbits);
2924					c = lzx_decode_huffman(at,
2925					      lzx_br_bits(&bre, at_max_bits));
2926					lzx_br_consume(&bre, at_bitlen[c]);
2927				}
2928				/* Add an aligned number. */
2929				copy_pos += c;
2930			} else {
2931				if (!lzx_br_read_ahead(strm, &bre,
2932				    offset_bits)) {
2933					state = ST_OFFSET;
2934					if (last)
2935						goto failed;
2936					goto next_data;
2937				}
2938				copy_pos = lzx_br_bits(&bre, offset_bits);
2939				lzx_br_consume(&bre, offset_bits);
2940			}
2941			copy_pos += pos_tbl[position_slot].base -2;
2942
2943			/* Update repeated offset LRU queue. */
2944			r2 = r1;
2945			r1 = r0;
2946			r0 = copy_pos;
2947			/* FALL THROUGH */
2948		case ST_REAL_POS:
2949			/*
2950			 * Compute a real position in window.
2951			 */
2952			copy_pos = (w_pos - copy_pos) & w_mask;
2953			/* FALL THROUGH */
2954		case ST_COPY:
2955			/*
2956			 * Copy several bytes as extracted data from the window
2957			 * into the output buffer.
2958			 */
2959			for (;;) {
2960				const unsigned char *s;
2961				int l;
2962
2963				l = copy_len;
2964				if (copy_pos > w_pos) {
2965					if (l > w_size - copy_pos)
2966						l = w_size - copy_pos;
2967				} else {
2968					if (l > w_size - w_pos)
2969						l = w_size - w_pos;
2970				}
2971				if (noutp + l >= endp)
2972					l = (int)(endp - noutp);
2973				s = w_buff + copy_pos;
2974				if (l >= 8 && ((copy_pos + l < w_pos)
2975				  || (w_pos + l < copy_pos))) {
2976					memcpy(w_buff + w_pos, s, l);
2977					memcpy(noutp, s, l);
2978				} else {
2979					unsigned char *d;
2980					int li;
2981
2982					d = w_buff + w_pos;
2983					for (li = 0; li < l; li++)
2984						noutp[li] = d[li] = s[li];
2985				}
2986				noutp += l;
2987				copy_pos = (copy_pos + l) & w_mask;
2988				w_pos = (w_pos + l) & w_mask;
2989				block_bytes_avail -= l;
2990				if (copy_len <= l)
2991					/* A copy of current pattern ended. */
2992					break;
2993				copy_len -= l;
2994				if (noutp >= endp) {
2995					/* Output buffer is empty. */
2996					state = ST_COPY;
2997					goto next_data;
2998				}
2999			}
3000			state = ST_MAIN;
3001			break;
3002		}
3003	}
3004failed:
3005	return (ds->error = ARCHIVE_FAILED);
3006next_data:
3007	ds->br = bre;
3008	ds->block_bytes_avail = block_bytes_avail;
3009	ds->copy_len = copy_len;
3010	ds->copy_pos = copy_pos;
3011	ds->length_header = length_header;
3012	ds->offset_bits = offset_bits;
3013	ds->position_slot = position_slot;
3014	ds->r0 = r0; ds->r1 = r1; ds->r2 = r2;
3015	ds->state = state;
3016	ds->w_pos = w_pos;
3017	strm->avail_out = endp - noutp;
3018	return (ARCHIVE_OK);
3019}
3020
3021static int
3022lzx_read_pre_tree(struct lzx_stream *strm)
3023{
3024	struct lzx_dec *ds = strm->ds;
3025	struct lzx_br *br = &(ds->br);
3026	int i;
3027
3028	if (ds->loop == 0)
3029		memset(ds->pt.freq, 0, sizeof(ds->pt.freq));
3030	for (i = ds->loop; i < ds->pt.len_size; i++) {
3031		if (!lzx_br_read_ahead(strm, br, 4)) {
3032			ds->loop = i;
3033			return (0);
3034		}
3035		ds->pt.bitlen[i] = lzx_br_bits(br, 4);
3036		ds->pt.freq[ds->pt.bitlen[i]]++;
3037		lzx_br_consume(br, 4);
3038	}
3039	ds->loop = i;
3040	return (1);
3041}
3042
3043/*
3044 * Read a bunch of bit-lengths from pre-tree.
3045 */
3046static int
3047lzx_read_bitlen(struct lzx_stream *strm, struct huffman *d, int end)
3048{
3049	struct lzx_dec *ds = strm->ds;
3050	struct lzx_br *br = &(ds->br);
3051	int c, i, j, ret, same;
3052	unsigned rbits;
3053
3054	i = ds->loop;
3055	if (i == 0)
3056		memset(d->freq, 0, sizeof(d->freq));
3057	ret = 0;
3058	if (end < 0)
3059		end = d->len_size;
3060	while (i < end) {
3061		ds->loop = i;
3062		if (!lzx_br_read_ahead(strm, br, ds->pt.max_bits))
3063			goto getdata;
3064		rbits = lzx_br_bits(br, ds->pt.max_bits);
3065		c = lzx_decode_huffman(&(ds->pt), rbits);
3066		switch (c) {
3067		case 17:/* several zero lengths, from 4 to 19. */
3068			if (!lzx_br_read_ahead(strm, br, ds->pt.bitlen[c]+4))
3069				goto getdata;
3070			lzx_br_consume(br, ds->pt.bitlen[c]);
3071			same = lzx_br_bits(br, 4) + 4;
3072			if (i + same > end)
3073				return (-1);/* Invalid */
3074			lzx_br_consume(br, 4);
3075			for (j = 0; j < same; j++)
3076				d->bitlen[i++] = 0;
3077			break;
3078		case 18:/* many zero lengths, from 20 to 51. */
3079			if (!lzx_br_read_ahead(strm, br, ds->pt.bitlen[c]+5))
3080				goto getdata;
3081			lzx_br_consume(br, ds->pt.bitlen[c]);
3082			same = lzx_br_bits(br, 5) + 20;
3083			if (i + same > end)
3084				return (-1);/* Invalid */
3085			lzx_br_consume(br, 5);
3086			memset(d->bitlen + i, 0, same);
3087			i += same;
3088			break;
3089		case 19:/* a few same lengths. */
3090			if (!lzx_br_read_ahead(strm, br,
3091			    ds->pt.bitlen[c]+1+ds->pt.max_bits))
3092				goto getdata;
3093			lzx_br_consume(br, ds->pt.bitlen[c]);
3094			same = lzx_br_bits(br, 1) + 4;
3095			if (i + same > end)
3096				return (-1);
3097			lzx_br_consume(br, 1);
3098			rbits = lzx_br_bits(br, ds->pt.max_bits);
3099			c = lzx_decode_huffman(&(ds->pt), rbits);
3100			lzx_br_consume(br, ds->pt.bitlen[c]);
3101			c = (d->bitlen[i] - c + 17) % 17;
3102			if (c < 0)
3103				return (-1);/* Invalid */
3104			for (j = 0; j < same; j++)
3105				d->bitlen[i++] = c;
3106			d->freq[c] += same;
3107			break;
3108		default:
3109			lzx_br_consume(br, ds->pt.bitlen[c]);
3110			c = (d->bitlen[i] - c + 17) % 17;
3111			if (c < 0)
3112				return (-1);/* Invalid */
3113			d->freq[c]++;
3114			d->bitlen[i++] = c;
3115			break;
3116		}
3117	}
3118	ret = 1;
3119getdata:
3120	ds->loop = i;
3121	return (ret);
3122}
3123
3124static int
3125lzx_huffman_init(struct huffman *hf, size_t len_size, int tbl_bits)
3126{
3127	int bits;
3128
3129	if (hf->bitlen == NULL || hf->len_size != (int)len_size) {
3130		free(hf->bitlen);
3131		hf->bitlen = calloc(len_size,  sizeof(hf->bitlen[0]));
3132		if (hf->bitlen == NULL)
3133			return (ARCHIVE_FATAL);
3134		hf->len_size = (int)len_size;
3135	} else
3136		memset(hf->bitlen, 0, len_size *  sizeof(hf->bitlen[0]));
3137	if (hf->tbl == NULL) {
3138		if (tbl_bits < HTBL_BITS)
3139			bits = tbl_bits;
3140		else
3141			bits = HTBL_BITS;
3142		hf->tbl = malloc(((size_t)1 << bits) * sizeof(hf->tbl[0]));
3143		if (hf->tbl == NULL)
3144			return (ARCHIVE_FATAL);
3145		hf->tbl_bits = tbl_bits;
3146	}
3147	if (hf->tree == NULL && tbl_bits > HTBL_BITS) {
3148		hf->tree_avail = 1 << (tbl_bits - HTBL_BITS + 4);
3149		hf->tree = malloc(hf->tree_avail * sizeof(hf->tree[0]));
3150		if (hf->tree == NULL)
3151			return (ARCHIVE_FATAL);
3152	}
3153	return (ARCHIVE_OK);
3154}
3155
3156static void
3157lzx_huffman_free(struct huffman *hf)
3158{
3159	free(hf->bitlen);
3160	free(hf->tbl);
3161	free(hf->tree);
3162}
3163
3164/*
3165 * Make a huffman coding table.
3166 */
3167static int
3168lzx_make_huffman_table(struct huffman *hf)
3169{
3170	uint16_t *tbl;
3171	const unsigned char *bitlen;
3172	int bitptn[17], weight[17];
3173	int i, maxbits = 0, ptn, tbl_size, w;
3174	int diffbits, len_avail;
3175
3176	/*
3177	 * Initialize bit patterns.
3178	 */
3179	ptn = 0;
3180	for (i = 1, w = 1 << 15; i <= 16; i++, w >>= 1) {
3181		bitptn[i] = ptn;
3182		weight[i] = w;
3183		if (hf->freq[i]) {
3184			ptn += hf->freq[i] * w;
3185			maxbits = i;
3186		}
3187	}
3188	if ((ptn & 0xffff) != 0 || maxbits > hf->tbl_bits)
3189		return (0);/* Invalid */
3190
3191	hf->max_bits = maxbits;
3192
3193	/*
3194	 * Cut out extra bits which we won't house in the table.
3195	 * This preparation reduces the same calculation in the for-loop
3196	 * making the table.
3197	 */
3198	if (maxbits < 16) {
3199		int ebits = 16 - maxbits;
3200		for (i = 1; i <= maxbits; i++) {
3201			bitptn[i] >>= ebits;
3202			weight[i] >>= ebits;
3203		}
3204	}
3205	if (maxbits > HTBL_BITS) {
3206		int htbl_max;
3207		uint16_t *p;
3208
3209		diffbits = maxbits - HTBL_BITS;
3210		for (i = 1; i <= HTBL_BITS; i++) {
3211			bitptn[i] >>= diffbits;
3212			weight[i] >>= diffbits;
3213		}
3214		htbl_max = bitptn[HTBL_BITS] +
3215		    weight[HTBL_BITS] * hf->freq[HTBL_BITS];
3216		p = &(hf->tbl[htbl_max]);
3217		while (p < &hf->tbl[1U<<HTBL_BITS])
3218			*p++ = 0;
3219	} else
3220		diffbits = 0;
3221	hf->shift_bits = diffbits;
3222
3223	/*
3224	 * Make the table.
3225	 */
3226	tbl_size = 1 << HTBL_BITS;
3227	tbl = hf->tbl;
3228	bitlen = hf->bitlen;
3229	len_avail = hf->len_size;
3230	hf->tree_used = 0;
3231	for (i = 0; i < len_avail; i++) {
3232		uint16_t *p;
3233		int len, cnt;
3234		uint16_t bit;
3235		int extlen;
3236		struct htree_t *ht;
3237
3238		if (bitlen[i] == 0)
3239			continue;
3240		/* Get a bit pattern */
3241		len = bitlen[i];
3242		ptn = bitptn[len];
3243		cnt = weight[len];
3244		if (len <= HTBL_BITS) {
3245			/* Calculate next bit pattern */
3246			if ((bitptn[len] = ptn + cnt) > tbl_size)
3247				return (0);/* Invalid */
3248			/* Update the table */
3249			p = &(tbl[ptn]);
3250			while (--cnt >= 0)
3251				p[cnt] = (uint16_t)i;
3252			continue;
3253		}
3254
3255		/*
3256		 * A bit length is too big to be housed to a direct table,
3257		 * so we use a tree model for its extra bits.
3258		 */
3259		bitptn[len] = ptn + cnt;
3260		bit = 1U << (diffbits -1);
3261		extlen = len - HTBL_BITS;
3262
3263		p = &(tbl[ptn >> diffbits]);
3264		if (*p == 0) {
3265			*p = len_avail + hf->tree_used;
3266			ht = &(hf->tree[hf->tree_used++]);
3267			if (hf->tree_used > hf->tree_avail)
3268				return (0);/* Invalid */
3269			ht->left = 0;
3270			ht->right = 0;
3271		} else {
3272			if (*p < len_avail ||
3273			    *p >= (len_avail + hf->tree_used))
3274				return (0);/* Invalid */
3275			ht = &(hf->tree[*p - len_avail]);
3276		}
3277		while (--extlen > 0) {
3278			if (ptn & bit) {
3279				if (ht->left < len_avail) {
3280					ht->left = len_avail + hf->tree_used;
3281					ht = &(hf->tree[hf->tree_used++]);
3282					if (hf->tree_used > hf->tree_avail)
3283						return (0);/* Invalid */
3284					ht->left = 0;
3285					ht->right = 0;
3286				} else {
3287					ht = &(hf->tree[ht->left - len_avail]);
3288				}
3289			} else {
3290				if (ht->right < len_avail) {
3291					ht->right = len_avail + hf->tree_used;
3292					ht = &(hf->tree[hf->tree_used++]);
3293					if (hf->tree_used > hf->tree_avail)
3294						return (0);/* Invalid */
3295					ht->left = 0;
3296					ht->right = 0;
3297				} else {
3298					ht = &(hf->tree[ht->right - len_avail]);
3299				}
3300			}
3301			bit >>= 1;
3302		}
3303		if (ptn & bit) {
3304			if (ht->left != 0)
3305				return (0);/* Invalid */
3306			ht->left = (uint16_t)i;
3307		} else {
3308			if (ht->right != 0)
3309				return (0);/* Invalid */
3310			ht->right = (uint16_t)i;
3311		}
3312	}
3313	return (1);
3314}
3315
3316static int
3317lzx_decode_huffman_tree(struct huffman *hf, unsigned rbits, int c)
3318{
3319	struct htree_t *ht;
3320	int extlen;
3321
3322	ht = hf->tree;
3323	extlen = hf->shift_bits;
3324	while (c >= hf->len_size) {
3325		c -= hf->len_size;
3326		if (extlen-- <= 0 || c >= hf->tree_used)
3327			return (0);
3328		if (rbits & (1U << extlen))
3329			c = ht[c].left;
3330		else
3331			c = ht[c].right;
3332	}
3333	return (c);
3334}
3335
3336static inline int
3337lzx_decode_huffman(struct huffman *hf, unsigned rbits)
3338{
3339	int c;
3340	/*
3341	 * At first search an index table for a bit pattern.
3342	 * If it fails, search a huffman tree for.
3343	 */
3344	c = hf->tbl[rbits >> hf->shift_bits];
3345	if (c < hf->len_size)
3346		return (c);
3347	/* This bit pattern needs to be found out at a huffman tree. */
3348	return (lzx_decode_huffman_tree(hf, rbits, c));
3349}
3350
3351