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