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