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