Import libarchive-3.0.4.
[dragonfly.git] / contrib / libarchive / libarchive / archive_read_support_format_rar.c
1 /*-
2 * Copyright (c) 2003-2007 Tim Kientzle
3 * Copyright (c) 2011 Andres Mejia
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 #include "archive_platform.h"
28
29 #ifdef HAVE_ERRNO_H
30 #include <errno.h>
31 #endif
32 #include <time.h>
33 #include <limits.h>
34 #ifdef HAVE_ZLIB_H
35 #include <zlib.h> /* crc32 */
36 #endif
37
38 #include "archive.h"
39 #ifndef HAVE_ZLIB_H
40 #include "archive_crc32.h"
41 #endif
42 #include "archive_endian.h"
43 #include "archive_entry.h"
44 #include "archive_entry_locale.h"
45 #include "archive_ppmd7_private.h"
46 #include "archive_private.h"
47 #include "archive_read_private.h"
48
49 /* RAR signature, also known as the mark header */
50 #define RAR_SIGNATURE "\x52\x61\x72\x21\x1A\x07\x00"
51
52 /* Header types */
53 #define MARK_HEAD    0x72
54 #define MAIN_HEAD    0x73
55 #define FILE_HEAD    0x74
56 #define COMM_HEAD    0x75
57 #define AV_HEAD      0x76
58 #define SUB_HEAD     0x77
59 #define PROTECT_HEAD 0x78
60 #define SIGN_HEAD    0x79
61 #define NEWSUB_HEAD  0x7a
62 #define ENDARC_HEAD  0x7b
63
64 /* Main Header Flags */
65 #define MHD_VOLUME       0x0001
66 #define MHD_COMMENT      0x0002
67 #define MHD_LOCK         0x0004
68 #define MHD_SOLID        0x0008
69 #define MHD_NEWNUMBERING 0x0010
70 #define MHD_AV           0x0020
71 #define MHD_PROTECT      0x0040
72 #define MHD_PASSWORD     0x0080
73 #define MHD_FIRSTVOLUME  0x0100
74 #define MHD_ENCRYPTVER   0x0200
75
76 /* Flags common to all headers */
77 #define HD_MARKDELETION     0x4000
78 #define HD_ADD_SIZE_PRESENT 0x8000
79
80 /* File Header Flags */
81 #define FHD_SPLIT_BEFORE 0x0001
82 #define FHD_SPLIT_AFTER  0x0002
83 #define FHD_PASSWORD     0x0004
84 #define FHD_COMMENT      0x0008
85 #define FHD_SOLID        0x0010
86 #define FHD_LARGE        0x0100
87 #define FHD_UNICODE      0x0200
88 #define FHD_SALT         0x0400
89 #define FHD_VERSION      0x0800
90 #define FHD_EXTTIME      0x1000
91 #define FHD_EXTFLAGS     0x2000
92
93 /* File dictionary sizes */
94 #define DICTIONARY_SIZE_64   0x00
95 #define DICTIONARY_SIZE_128  0x20
96 #define DICTIONARY_SIZE_256  0x40
97 #define DICTIONARY_SIZE_512  0x60
98 #define DICTIONARY_SIZE_1024 0x80
99 #define DICTIONARY_SIZE_2048 0xA0
100 #define DICTIONARY_SIZE_4096 0xC0
101 #define FILE_IS_DIRECTORY    0xE0
102 #define DICTIONARY_MASK      FILE_IS_DIRECTORY
103
104 /* OS Flags */
105 #define OS_MSDOS  0
106 #define OS_OS2    1
107 #define OS_WIN32  2
108 #define OS_UNIX   3
109 #define OS_MAC_OS 4
110 #define OS_BEOS   5
111
112 /* Compression Methods */
113 #define COMPRESS_METHOD_STORE   0x30
114 /* LZSS */
115 #define COMPRESS_METHOD_FASTEST 0x31
116 #define COMPRESS_METHOD_FAST    0x32
117 #define COMPRESS_METHOD_NORMAL  0x33
118 /* PPMd Variant H */
119 #define COMPRESS_METHOD_GOOD    0x34
120 #define COMPRESS_METHOD_BEST    0x35
121
122 #define CRC_POLYNOMIAL 0xEDB88320
123
124 #define NS_UNIT 10000000
125
126 #define DICTIONARY_MAX_SIZE 0x400000
127
128 #define MAINCODE_SIZE      299
129 #define OFFSETCODE_SIZE    60
130 #define LOWOFFSETCODE_SIZE 17
131 #define LENGTHCODE_SIZE    28
132 #define HUFFMAN_TABLE_SIZE \
133   MAINCODE_SIZE + OFFSETCODE_SIZE + LOWOFFSETCODE_SIZE + LENGTHCODE_SIZE
134
135 #define MAX_SYMBOL_LENGTH 0xF
136 #define MAX_SYMBOLS       20
137
138 /*
139  * Considering L1,L2 cache miss and a calling of write system-call,
140  * the best size of the output buffer(uncompressed buffer) is 128K.
141  * If the structure of extracting process is changed, this value
142  * might be researched again.
143  */
144 #define UNP_BUFFER_SIZE   (128 * 1024)
145
146 /* Define this here for non-Windows platforms */
147 #if !((defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__))
148 #define FILE_ATTRIBUTE_DIRECTORY 0x10
149 #endif
150
151 /* Fields common to all headers */
152 struct rar_header
153 {
154   char crc[2];
155   char type;
156   char flags[2];
157   char size[2];
158 };
159
160 /* Fields common to all file headers */
161 struct rar_file_header
162 {
163   char pack_size[4];
164   char unp_size[4];
165   char host_os;
166   char file_crc[4];
167   char file_time[4];
168   char unp_ver;
169   char method;
170   char name_size[2];
171   char file_attr[4];
172 };
173
174 struct huffman_tree_node
175 {
176   int branches[2];
177 };
178
179 struct huffman_table_entry
180 {
181   unsigned int length;
182   int value;
183 };
184
185 struct huffman_code
186 {
187   struct huffman_tree_node *tree;
188   int numentries;
189   int minlength;
190   int maxlength;
191   int tablesize;
192   struct huffman_table_entry *table;
193 };
194
195 struct lzss
196 {
197   unsigned char *window;
198   int mask;
199   int64_t position;
200 };
201
202 struct rar
203 {
204   /* Entries from main RAR header */
205   unsigned main_flags;
206   unsigned long file_crc;
207   char reserved1[2];
208   char reserved2[4];
209   char encryptver;
210
211   /* File header entries */
212   char compression_method;
213   unsigned file_flags;
214   int64_t packed_size;
215   int64_t unp_size;
216   time_t mtime;
217   long mnsec;
218   mode_t mode;
219   char *filename;
220   size_t filename_allocated;
221
222   /* File header optional entries */
223   char salt[8];
224   time_t atime;
225   long ansec;
226   time_t ctime;
227   long cnsec;
228   time_t arctime;
229   long arcnsec;
230
231   /* Fields to help with tracking decompression of files. */
232   int64_t bytes_unconsumed;
233   int64_t bytes_remaining;
234   int64_t bytes_uncopied;
235   int64_t offset;
236   int64_t offset_outgoing;
237   char valid;
238   unsigned int unp_offset;
239   unsigned int unp_buffer_size;
240   unsigned char *unp_buffer;
241   unsigned int dictionary_size;
242   char start_new_block;
243   char entry_eof;
244   unsigned long crc_calculated;
245   int found_first_header;
246
247   /* LZSS members */
248   struct huffman_code maincode;
249   struct huffman_code offsetcode;
250   struct huffman_code lowoffsetcode;
251   struct huffman_code lengthcode;
252   unsigned char lengthtable[HUFFMAN_TABLE_SIZE];
253   struct lzss lzss;
254   char output_last_match;
255   unsigned int lastlength;
256   unsigned int lastoffset;
257   unsigned int oldoffset[4];
258   unsigned int lastlowoffset;
259   unsigned int numlowoffsetrepeats;
260   int64_t filterstart;
261   char start_new_table;
262
263   /* PPMd Variant H members */
264   char ppmd_valid;
265   char ppmd_eod;
266   char is_ppmd_block;
267   int ppmd_escape;
268   CPpmd7 ppmd7_context;
269   CPpmd7z_RangeDec range_dec;
270   IByteIn bytein;
271
272   /*
273    * String conversion object.
274    */
275   int init_default_conversion;
276   struct archive_string_conv *sconv_default;
277   struct archive_string_conv *opt_sconv;
278   struct archive_string_conv *sconv_utf8;
279   struct archive_string_conv *sconv_utf16be;
280
281   /*
282    * Bit stream reader.
283    */
284   struct rar_br {
285 #define CACHE_TYPE      uint64_t
286 #define CACHE_BITS      (8 * sizeof(CACHE_TYPE))
287     /* Cache buffer. */
288     CACHE_TYPE           cache_buffer;
289     /* Indicates how many bits avail in cache_buffer. */
290     int                  cache_avail;
291     ssize_t              avail_in;
292     const unsigned char *next_in;
293   } br;
294 };
295
296 static int archive_read_format_rar_bid(struct archive_read *, int);
297 static int archive_read_format_rar_options(struct archive_read *,
298     const char *, const char *);
299 static int archive_read_format_rar_read_header(struct archive_read *,
300     struct archive_entry *);
301 static int archive_read_format_rar_read_data(struct archive_read *,
302     const void **, size_t *, int64_t *);
303 static int archive_read_format_rar_read_data_skip(struct archive_read *a);
304 static int archive_read_format_rar_cleanup(struct archive_read *);
305
306 /* Support functions */
307 static int read_header(struct archive_read *, struct archive_entry *, char);
308 static time_t get_time(int);
309 static int read_exttime(const char *, struct rar *, const char *);
310 static int read_symlink_stored(struct archive_read *, struct archive_entry *,
311                                struct archive_string_conv *);
312 static int read_data_stored(struct archive_read *, const void **, size_t *,
313                             int64_t *);
314 static int read_data_compressed(struct archive_read *, const void **, size_t *,
315                           int64_t *);
316 static int rar_br_preparation(struct archive_read *, struct rar_br *);
317 static int parse_codes(struct archive_read *);
318 static void free_codes(struct archive_read *);
319 static int read_next_symbol(struct archive_read *, struct huffman_code *);
320 static int create_code(struct archive_read *, struct huffman_code *,
321                         unsigned char *, int, char);
322 static int add_value(struct archive_read *, struct huffman_code *, int, int,
323                      int);
324 static int new_node(struct huffman_code *);
325 static int make_table(struct archive_read *, struct huffman_code *);
326 static int make_table_recurse(struct archive_read *, struct huffman_code *, int,
327                               struct huffman_table_entry *, int, int);
328 static int64_t expand(struct archive_read *, int64_t);
329 static int copy_from_lzss_window(struct archive_read *, const void **,
330                                    int64_t, int);
331
332 /*
333  * Bit stream reader.
334  */
335 /* Check that the cache buffer has enough bits. */
336 #define rar_br_has(br, n) ((br)->cache_avail >= n)
337 /* Get compressed data by bit. */
338 #define rar_br_bits(br, n)        \
339   (((uint32_t)((br)->cache_buffer >>    \
340     ((br)->cache_avail - (n)))) & cache_masks[n])
341 #define rar_br_bits_forced(br, n)     \
342   (((uint32_t)((br)->cache_buffer <<    \
343     ((n) - (br)->cache_avail))) & cache_masks[n])
344 /* Read ahead to make sure the cache buffer has enough compressed data we
345  * will use.
346  *  True  : completed, there is enough data in the cache buffer.
347  *  False : there is no data in the stream. */
348 #define rar_br_read_ahead(a, br, n) \
349   ((rar_br_has(br, (n)) || rar_br_fillup(a, br)) || rar_br_has(br, (n)))
350 /* Notify how many bits we consumed. */
351 #define rar_br_consume(br, n) ((br)->cache_avail -= (n))
352 #define rar_br_consume_unalined_bits(br) ((br)->cache_avail &= ~7)
353
354 static const uint32_t cache_masks[] = {
355   0x00000000, 0x00000001, 0x00000003, 0x00000007,
356   0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F,
357   0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
358   0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
359   0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF,
360   0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
361   0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF,
362   0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
363   0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
364 };
365
366 /*
367  * Shift away used bits in the cache data and fill it up with following bits.
368  * Call this when cache buffer does not have enough bits you need.
369  *
370  * Returns 1 if the cache buffer is full.
371  * Returns 0 if the cache buffer is not full; input buffer is empty.
372  */
373 static int
374 rar_br_fillup(struct archive_read *a, struct rar_br *br)
375 {
376   struct rar *rar = (struct rar *)(a->format->data);
377   int n = CACHE_BITS - br->cache_avail;
378
379   for (;;) {
380     switch (n >> 3) {
381     case 8:
382       if (br->avail_in >= 8) {
383         br->cache_buffer =
384             ((uint64_t)br->next_in[0]) << 56 |
385             ((uint64_t)br->next_in[1]) << 48 |
386             ((uint64_t)br->next_in[2]) << 40 |
387             ((uint64_t)br->next_in[3]) << 32 |
388             ((uint32_t)br->next_in[4]) << 24 |
389             ((uint32_t)br->next_in[5]) << 16 |
390             ((uint32_t)br->next_in[6]) << 8 |
391              (uint32_t)br->next_in[7];
392         br->next_in += 8;
393         br->avail_in -= 8;
394         br->cache_avail += 8 * 8;
395         rar->bytes_unconsumed += 8;
396         rar->bytes_remaining -= 8;
397         return (1);
398       }
399       break;
400     case 7:
401       if (br->avail_in >= 7) {
402         br->cache_buffer =
403            (br->cache_buffer << 56) |
404             ((uint64_t)br->next_in[0]) << 48 |
405             ((uint64_t)br->next_in[1]) << 40 |
406             ((uint64_t)br->next_in[2]) << 32 |
407             ((uint32_t)br->next_in[3]) << 24 |
408             ((uint32_t)br->next_in[4]) << 16 |
409             ((uint32_t)br->next_in[5]) << 8 |
410              (uint32_t)br->next_in[6];
411         br->next_in += 7;
412         br->avail_in -= 7;
413         br->cache_avail += 7 * 8;
414         rar->bytes_unconsumed += 7;
415         rar->bytes_remaining -= 7;
416         return (1);
417       }
418       break;
419     case 6:
420       if (br->avail_in >= 6) {
421         br->cache_buffer =
422            (br->cache_buffer << 48) |
423             ((uint64_t)br->next_in[0]) << 40 |
424             ((uint64_t)br->next_in[1]) << 32 |
425             ((uint32_t)br->next_in[2]) << 24 |
426             ((uint32_t)br->next_in[3]) << 16 |
427             ((uint32_t)br->next_in[4]) << 8 |
428              (uint32_t)br->next_in[5];
429         br->next_in += 6;
430         br->avail_in -= 6;
431         br->cache_avail += 6 * 8;
432         rar->bytes_unconsumed += 6;
433         rar->bytes_remaining -= 6;
434         return (1);
435       }
436       break;
437     case 0:
438       /* We have enough compressed data in
439        * the cache buffer.*/
440       return (1);
441     default:
442       break;
443     }
444     if (br->avail_in <= 0) {
445
446       if (rar->bytes_unconsumed > 0) {
447         /* Consume as much as the decompressor
448          * actually used. */
449         __archive_read_consume(a, rar->bytes_unconsumed);
450         rar->bytes_unconsumed = 0;
451       }
452       br->next_in = __archive_read_ahead(a, 1, &(br->avail_in));
453       if (br->next_in == NULL)
454         return (0);
455       if (br->avail_in > rar->bytes_remaining)
456         br->avail_in = (ssize_t)rar->bytes_remaining;
457       if (br->avail_in == 0)
458         return (0);
459     }
460     br->cache_buffer =
461        (br->cache_buffer << 8) | *br->next_in++;
462     br->avail_in--;
463     br->cache_avail += 8;
464     n -= 8;
465     rar->bytes_unconsumed++;
466     rar->bytes_remaining--;
467   }
468 }
469
470 static int
471 rar_br_preparation(struct archive_read *a, struct rar_br *br)
472 {
473   struct rar *rar = (struct rar *)(a->format->data);
474
475   if (rar->bytes_remaining > 0) {
476     br->next_in = __archive_read_ahead(a, 1, &(br->avail_in));
477     if (br->next_in == NULL) {
478       archive_set_error(&a->archive,
479           ARCHIVE_ERRNO_FILE_FORMAT,
480           "Truncated RAR file data");
481       return (ARCHIVE_FATAL);
482     }
483     if (br->avail_in > rar->bytes_remaining)
484       br->avail_in = (ssize_t)rar->bytes_remaining;
485     if (br->cache_avail == 0)
486       (void)rar_br_fillup(a, br);
487   }
488   return (ARCHIVE_OK);
489 }
490
491 /* Find last bit set */
492 static inline int
493 rar_fls(unsigned int word)
494 {
495   word |= (word >>  1);
496   word |= (word >>  2);
497   word |= (word >>  4);
498   word |= (word >>  8);
499   word |= (word >> 16);
500   return word - (word >> 1);
501 }
502
503 /* LZSS functions */
504 static inline int64_t
505 lzss_position(struct lzss *lzss)
506 {
507   return lzss->position;
508 }
509
510 static inline int
511 lzss_mask(struct lzss *lzss)
512 {
513   return lzss->mask;
514 }
515
516 static inline int
517 lzss_size(struct lzss *lzss)
518 {
519   return lzss->mask + 1;
520 }
521
522 static inline int
523 lzss_offset_for_position(struct lzss *lzss, int64_t pos)
524 {
525   return (int)(pos & lzss->mask);
526 }
527
528 static inline unsigned char *
529 lzss_pointer_for_position(struct lzss *lzss, int64_t pos)
530 {
531   return &lzss->window[lzss_offset_for_position(lzss, pos)];
532 }
533
534 static inline int
535 lzss_current_offset(struct lzss *lzss)
536 {
537   return lzss_offset_for_position(lzss, lzss->position);
538 }
539
540 static inline uint8_t *
541 lzss_current_pointer(struct lzss *lzss)
542 {
543   return lzss_pointer_for_position(lzss, lzss->position);
544 }
545
546 static inline void
547 lzss_emit_literal(struct rar *rar, uint8_t literal)
548 {
549   *lzss_current_pointer(&rar->lzss) = literal;
550   rar->lzss.position++;
551 }
552
553 static inline void
554 lzss_emit_match(struct rar *rar, int offset, int length)
555 {
556   int dstoffs = lzss_current_offset(&rar->lzss);
557   int srcoffs = (dstoffs - offset) & lzss_mask(&rar->lzss);
558   int l, li, remaining;
559   unsigned char *d, *s;
560
561   remaining = length;
562   while (remaining > 0) {
563     l = remaining;
564     if (dstoffs > srcoffs) {
565       if (l > lzss_size(&rar->lzss) - dstoffs)
566         l = lzss_size(&rar->lzss) - dstoffs;
567     } else {
568       if (l > lzss_size(&rar->lzss) - srcoffs)
569         l = lzss_size(&rar->lzss) - srcoffs;
570     }
571     d = &(rar->lzss.window[dstoffs]);
572     s = &(rar->lzss.window[srcoffs]);
573     if ((dstoffs + l < srcoffs) || (srcoffs + l < dstoffs))
574       memcpy(d, s, l);
575     else {
576       for (li = 0; li < l; li++)
577         d[li] = s[li];
578     }
579     remaining -= l;
580     dstoffs = (dstoffs + l) & lzss_mask(&(rar->lzss));
581     srcoffs = (srcoffs + l) & lzss_mask(&(rar->lzss));
582   }
583   rar->lzss.position += length;
584 }
585
586 static void *
587 ppmd_alloc(void *p, size_t size)
588 {
589   (void)p;
590   return malloc(size);
591 }
592 static void
593 ppmd_free(void *p, void *address)
594 {
595   (void)p;
596   free(address);
597 }
598 static ISzAlloc g_szalloc = { ppmd_alloc, ppmd_free };
599
600 static Byte
601 ppmd_read(void *p)
602 {
603   struct archive_read *a = ((IByteIn*)p)->a;
604   struct rar *rar = (struct rar *)(a->format->data);
605   struct rar_br *br = &(rar->br);
606   Byte b;
607   if (!rar_br_read_ahead(a, br, 8))
608   {
609     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
610                       "Truncated RAR file data");
611     rar->valid = 0;
612     return 0;
613   }
614   b = rar_br_bits(br, 8);
615   rar_br_consume(br, 8);
616   return b;
617 }
618
619 int
620 archive_read_support_format_rar(struct archive *_a)
621 {
622   struct archive_read *a = (struct archive_read *)_a;
623   struct rar *rar;
624   int r;
625
626   archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
627                       "archive_read_support_format_rar");
628
629   rar = (struct rar *)malloc(sizeof(*rar));
630   if (rar == NULL)
631   {
632     archive_set_error(&a->archive, ENOMEM, "Can't allocate rar data");
633     return (ARCHIVE_FATAL);
634   }
635   memset(rar, 0, sizeof(*rar));
636
637   r = __archive_read_register_format(a,
638                                      rar,
639                                      "rar",
640                                      archive_read_format_rar_bid,
641                                      archive_read_format_rar_options,
642                                      archive_read_format_rar_read_header,
643                                      archive_read_format_rar_read_data,
644                                      archive_read_format_rar_read_data_skip,
645                                      archive_read_format_rar_cleanup);
646
647   if (r != ARCHIVE_OK)
648     free(rar);
649   return (r);
650 }
651
652 static int
653 archive_read_format_rar_bid(struct archive_read *a, int best_bid)
654 {
655   const char *p;
656
657   /* If there's already a bid > 30, we'll never win. */
658   if (best_bid > 30)
659           return (-1);
660
661   if ((p = __archive_read_ahead(a, 7, NULL)) == NULL)
662     return (-1);
663
664   if (memcmp(p, RAR_SIGNATURE, 7) == 0)
665     return (30);
666
667   if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) {
668     /* This is a PE file */
669     ssize_t offset = 0x10000;
670     ssize_t window = 4096;
671     ssize_t bytes_avail;
672     while (offset + window <= (1024 * 128)) {
673       const char *buff = __archive_read_ahead(a, offset + window, &bytes_avail);
674       if (buff == NULL) {
675         /* Remaining bytes are less than window. */
676         window >>= 1;
677         if (window < 0x40)
678           return (0);
679         continue;
680       }
681       p = buff + offset;
682       while (p + 7 < buff + bytes_avail) {
683         if (memcmp(p, RAR_SIGNATURE, 7) == 0)
684           return (30);
685         p += 0x10;
686       }
687       offset = p - buff;
688     }
689   }
690   return (0);
691 }
692
693 static int
694 skip_sfx(struct archive_read *a)
695 {
696   const void *h;
697   const char *p, *q;
698   size_t skip, total;
699   ssize_t bytes, window;
700
701   total = 0;
702   window = 4096;
703   while (total + window <= (1024 * 128)) {
704     h = __archive_read_ahead(a, window, &bytes);
705     if (h == NULL) {
706       /* Remaining bytes are less than window. */
707       window >>= 1;
708       if (window < 0x40)
709         goto fatal;
710       continue;
711     }
712     if (bytes < 0x40)
713       goto fatal;
714     p = h;
715     q = p + bytes;
716
717     /*
718      * Scan ahead until we find something that looks
719      * like the RAR header.
720      */
721     while (p + 7 < q) {
722       if (memcmp(p, RAR_SIGNATURE, 7) == 0) {
723         skip = p - (const char *)h;
724         __archive_read_consume(a, skip);
725         return (ARCHIVE_OK);
726       }
727       p += 0x10;
728     }
729     skip = p - (const char *)h;
730     __archive_read_consume(a, skip);
731         total += skip;
732   }
733 fatal:
734   archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
735       "Couldn't find out RAR header");
736   return (ARCHIVE_FATAL);
737 }
738
739 static int
740 archive_read_format_rar_options(struct archive_read *a,
741     const char *key, const char *val)
742 {
743   struct rar *rar;
744   int ret = ARCHIVE_FAILED;
745         
746   rar = (struct rar *)(a->format->data);
747   if (strcmp(key, "hdrcharset")  == 0) {
748     if (val == NULL || val[0] == 0)
749       archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
750           "rar: hdrcharset option needs a character-set name");
751     else {
752       rar->opt_sconv =
753           archive_string_conversion_from_charset(
754               &a->archive, val, 0);
755       if (rar->opt_sconv != NULL)
756         ret = ARCHIVE_OK;
757       else
758         ret = ARCHIVE_FATAL;
759     }
760     return (ret);
761   }
762
763   /* Note: The "warn" return is just to inform the options
764    * supervisor that we didn't handle it.  It will generate
765    * a suitable error if no one used this option. */
766   return (ARCHIVE_WARN);
767 }
768
769 static int
770 archive_read_format_rar_read_header(struct archive_read *a,
771                                     struct archive_entry *entry)
772 {
773   const void *h;
774   const char *p;
775   struct rar *rar;
776   size_t skip;
777   char head_type;
778   int ret;
779   unsigned flags;
780
781   a->archive.archive_format = ARCHIVE_FORMAT_RAR;
782   if (a->archive.archive_format_name == NULL)
783     a->archive.archive_format_name = "RAR";
784
785   rar = (struct rar *)(a->format->data);
786
787   /* RAR files can be generated without EOF headers, so return ARCHIVE_EOF if
788   * this fails.
789   */
790   if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
791     return (ARCHIVE_EOF);
792
793   p = h;
794   if (rar->found_first_header == 0 &&
795      ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0)) {
796     /* This is an executable ? Must be self-extracting... */
797     ret = skip_sfx(a);
798     if (ret < ARCHIVE_WARN)
799       return (ret);
800   }
801   rar->found_first_header = 1;
802
803   while (1)
804   {
805     unsigned long crc32_val;
806
807     if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
808       return (ARCHIVE_FATAL);
809     p = h;
810
811     head_type = p[2];
812     switch(head_type)
813     {
814     case MARK_HEAD:
815       if (memcmp(p, RAR_SIGNATURE, 7) != 0) {
816         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
817           "Invalid marker header");
818         return (ARCHIVE_FATAL);
819       }
820       __archive_read_consume(a, 7);
821       break;
822
823     case MAIN_HEAD:
824       rar->main_flags = archive_le16dec(p + 3);
825       skip = archive_le16dec(p + 5);
826       if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)) {
827         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
828           "Invalid header size");
829         return (ARCHIVE_FATAL);
830       }
831       if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
832         return (ARCHIVE_FATAL);
833       p = h;
834       memcpy(rar->reserved1, p + 7, sizeof(rar->reserved1));
835       memcpy(rar->reserved2, p + 7 + sizeof(rar->reserved1),
836              sizeof(rar->reserved2));
837       if (rar->main_flags & MHD_ENCRYPTVER) {
838         if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)+1) {
839           archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
840             "Invalid header size");
841           return (ARCHIVE_FATAL);
842         }
843         rar->encryptver = *(p + 7 + sizeof(rar->reserved1) +
844                             sizeof(rar->reserved2));
845       }
846
847       if (rar->main_flags & MHD_VOLUME ||
848           rar->main_flags & MHD_FIRSTVOLUME)
849       {
850         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
851                           "RAR volume support unavailable.");
852         return (ARCHIVE_FATAL);
853       }
854       if (rar->main_flags & MHD_PASSWORD)
855       {
856         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
857                           "RAR encryption support unavailable.");
858         return (ARCHIVE_FATAL);
859       }
860
861       crc32_val = crc32(0, (const unsigned char *)p + 2, skip - 2);
862       if ((crc32_val & 0xffff) != archive_le16dec(p)) {
863         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
864           "Header CRC error");
865         return (ARCHIVE_FATAL);
866       }
867       __archive_read_consume(a, skip);
868       break;
869
870     case FILE_HEAD:
871       return read_header(a, entry, head_type);
872
873     case COMM_HEAD:
874     case AV_HEAD:
875     case SUB_HEAD:
876     case PROTECT_HEAD:
877     case SIGN_HEAD:
878       flags = archive_le16dec(p + 3);
879       skip = archive_le16dec(p + 5);
880       if (skip < 7) {
881         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
882           "Invalid header size");
883         return (ARCHIVE_FATAL);
884       }
885       if (skip > 7) {
886         if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
887           return (ARCHIVE_FATAL);
888         p = h;
889       }
890       if (flags & HD_ADD_SIZE_PRESENT)
891       {
892         if (skip < 7 + 4) {
893           archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
894             "Invalid header size");
895           return (ARCHIVE_FATAL);
896         }
897         skip += archive_le32dec(p + 7);
898         if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
899           return (ARCHIVE_FATAL);
900         p = h;
901       }
902
903       crc32_val = crc32(0, (const unsigned char *)p + 2, skip - 2);
904       if ((crc32_val & 0xffff) != archive_le16dec(p)) {
905         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
906           "Header CRC error");
907         return (ARCHIVE_FATAL);
908       }
909       __archive_read_consume(a, skip);
910       break;
911
912     case NEWSUB_HEAD:
913       if ((ret = read_header(a, entry, head_type)) < ARCHIVE_WARN)
914         return ret;
915       break;
916
917     case ENDARC_HEAD:
918       return (ARCHIVE_EOF);
919
920     default:
921       archive_set_error(&a->archive,  ARCHIVE_ERRNO_FILE_FORMAT,
922                         "Bad RAR file");
923       return (ARCHIVE_FATAL);
924     }
925   }
926 }
927
928 static int
929 archive_read_format_rar_read_data(struct archive_read *a, const void **buff,
930                                   size_t *size, int64_t *offset)
931 {
932   struct rar *rar = (struct rar *)(a->format->data);
933   int ret;
934
935   if (rar->bytes_unconsumed > 0) {
936       /* Consume as much as the decompressor actually used. */
937       __archive_read_consume(a, rar->bytes_unconsumed);
938       rar->bytes_unconsumed = 0;
939   }
940
941   if (rar->entry_eof) {
942     *buff = NULL;
943     *size = 0;
944     *offset = rar->offset;
945     return (ARCHIVE_EOF);
946   }
947
948   switch (rar->compression_method)
949   {
950   case COMPRESS_METHOD_STORE:
951     ret = read_data_stored(a, buff, size, offset);
952     break; 
953
954   case COMPRESS_METHOD_FASTEST:
955   case COMPRESS_METHOD_FAST:
956   case COMPRESS_METHOD_NORMAL:
957   case COMPRESS_METHOD_GOOD:
958   case COMPRESS_METHOD_BEST:
959     ret = read_data_compressed(a, buff, size, offset);
960     if (ret != ARCHIVE_OK && ret != ARCHIVE_WARN)
961       __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
962     break; 
963
964   default:
965     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
966                       "Unsupported compression method for RAR file.");
967     ret = ARCHIVE_FATAL;
968     break; 
969   }
970   return (ret);
971 }
972
973 static int
974 archive_read_format_rar_read_data_skip(struct archive_read *a)
975 {
976   struct rar *rar;
977   int64_t bytes_skipped;
978
979   rar = (struct rar *)(a->format->data);
980
981   if (rar->bytes_unconsumed > 0) {
982       /* Consume as much as the decompressor actually used. */
983       __archive_read_consume(a, rar->bytes_unconsumed);
984       rar->bytes_unconsumed = 0;
985   }
986
987   if (rar->bytes_remaining > 0) {
988     bytes_skipped = __archive_read_consume(a, rar->bytes_remaining);
989     if (bytes_skipped < 0)
990       return (ARCHIVE_FATAL);
991   }
992   return (ARCHIVE_OK);
993 }
994
995 static int
996 archive_read_format_rar_cleanup(struct archive_read *a)
997 {
998   struct rar *rar;
999
1000   rar = (struct rar *)(a->format->data);
1001   free_codes(a);
1002   free(rar->filename);
1003   free(rar->unp_buffer);
1004   free(rar->lzss.window);
1005   __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
1006   free(rar);
1007   (a->format->data) = NULL;
1008   return (ARCHIVE_OK);
1009 }
1010
1011 static int
1012 read_header(struct archive_read *a, struct archive_entry *entry,
1013             char head_type)
1014 {
1015   const void *h;
1016   const char *p, *endp;
1017   struct rar *rar;
1018   struct rar_header rar_header;
1019   struct rar_file_header file_header;
1020   int64_t header_size;
1021   unsigned filename_size, end;
1022   char *filename;
1023   char *strp;
1024   char packed_size[8];
1025   char unp_size[8];
1026   int ttime;
1027   struct archive_string_conv *sconv, *fn_sconv;
1028   unsigned long crc32_val;
1029   int ret = (ARCHIVE_OK), ret2;
1030
1031   rar = (struct rar *)(a->format->data);
1032
1033   /* Setup a string conversion object for non-rar-unicode filenames. */
1034   sconv = rar->opt_sconv;
1035   if (sconv == NULL) {
1036     if (!rar->init_default_conversion) {
1037       rar->sconv_default =
1038           archive_string_default_conversion_for_read(
1039             &(a->archive));
1040       rar->init_default_conversion = 1;
1041     }
1042     sconv = rar->sconv_default;
1043   }
1044
1045
1046   if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
1047     return (ARCHIVE_FATAL);
1048   p = h;
1049   memcpy(&rar_header, p, sizeof(rar_header));
1050   rar->file_flags = archive_le16dec(rar_header.flags);
1051   header_size = archive_le16dec(rar_header.size);
1052   if (header_size < (int64_t)sizeof(file_header) + 7) {
1053     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1054       "Invalid header size");
1055     return (ARCHIVE_FATAL);
1056   }
1057   crc32_val = crc32(0, (const unsigned char *)p + 2, 7 - 2);
1058   __archive_read_consume(a, 7);
1059
1060   if (!(rar->file_flags & FHD_SOLID))
1061   {
1062     rar->compression_method = 0;
1063     rar->packed_size = 0;
1064     rar->unp_size = 0;
1065     rar->mtime = 0;
1066     rar->ctime = 0;
1067     rar->atime = 0;
1068     rar->arctime = 0;
1069     rar->mode = 0;
1070     memset(&rar->salt, 0, sizeof(rar->salt));
1071     rar->atime = 0;
1072     rar->ansec = 0;
1073     rar->ctime = 0;
1074     rar->cnsec = 0;
1075     rar->mtime = 0;
1076     rar->mnsec = 0;
1077     rar->arctime = 0;
1078     rar->arcnsec = 0;
1079   }
1080   else
1081   {
1082     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1083                       "RAR solid archive support unavailable.");
1084     return (ARCHIVE_FATAL);
1085   }
1086
1087   if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL)
1088     return (ARCHIVE_FATAL);
1089
1090   /* File Header CRC check. */
1091   crc32_val = crc32(crc32_val, h, (unsigned)(header_size - 7));
1092   if ((crc32_val & 0xffff) != archive_le16dec(rar_header.crc)) {
1093     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1094       "Header CRC error");
1095     return (ARCHIVE_FATAL);
1096   }
1097   /* If no CRC error, Go on parsing File Header. */
1098   p = h;
1099   endp = p + header_size - 7;
1100   memcpy(&file_header, p, sizeof(file_header));
1101   p += sizeof(file_header);
1102
1103   rar->compression_method = file_header.method;
1104
1105   ttime = archive_le32dec(file_header.file_time);
1106   rar->mtime = get_time(ttime);
1107
1108   rar->file_crc = archive_le32dec(file_header.file_crc);
1109
1110   if (rar->file_flags & FHD_PASSWORD)
1111   {
1112     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1113                       "RAR encryption support unavailable.");
1114     return (ARCHIVE_FATAL);
1115   }
1116
1117   if (rar->file_flags & FHD_LARGE)
1118   {
1119     memcpy(packed_size, file_header.pack_size, 4);
1120     memcpy(packed_size + 4, p, 4); /* High pack size */
1121     p += 4;
1122     memcpy(unp_size, file_header.unp_size, 4);
1123     memcpy(unp_size + 4, p, 4); /* High unpack size */
1124     p += 4;
1125     rar->packed_size = archive_le64dec(&packed_size);
1126     rar->unp_size = archive_le64dec(&unp_size);
1127   }
1128   else
1129   {
1130     rar->packed_size = archive_le32dec(file_header.pack_size);
1131     rar->unp_size = archive_le32dec(file_header.unp_size);
1132   }
1133
1134   if (rar->packed_size < 0 || rar->unp_size < 0)
1135   {
1136     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1137                       "Invalid sizes specified.");
1138     return (ARCHIVE_FATAL);
1139   }
1140
1141   /* TODO: RARv3 subblocks contain comments. For now the complete block is
1142    * consumed at the end.
1143    */
1144   if (head_type == NEWSUB_HEAD) {
1145     size_t distance = p - (const char *)h;
1146     header_size += rar->packed_size;
1147     /* Make sure we have the extended data. */
1148     if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL)
1149         return (ARCHIVE_FATAL);
1150     p = h;
1151     endp = p + header_size - 7;
1152     p += distance;
1153   }
1154
1155   filename_size = archive_le16dec(file_header.name_size);
1156   if (p + filename_size > endp) {
1157     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1158       "Invalid filename size");
1159     return (ARCHIVE_FATAL);
1160   }
1161   if (rar->filename_allocated < filename_size * 2 + 2) {
1162     char *newptr;
1163     size_t newsize = filename_size * 2 + 2;
1164     newptr = realloc(rar->filename, newsize);
1165     if (newptr == NULL) {
1166       archive_set_error(&a->archive, ENOMEM,
1167                         "Couldn't allocate memory.");
1168       return (ARCHIVE_FATAL);
1169     }
1170     rar->filename = newptr;
1171     rar->filename_allocated = newsize;
1172   }
1173   filename = rar->filename;
1174   memcpy(filename, p, filename_size);
1175   filename[filename_size] = '\0';
1176   if (rar->file_flags & FHD_UNICODE)
1177   {
1178     if (filename_size != strlen(filename))
1179     {
1180       unsigned char highbyte, flagbits, flagbyte, offset;
1181       unsigned fn_end;
1182
1183       end = filename_size;
1184       fn_end = filename_size * 2;
1185       filename_size = 0;
1186       offset = strlen(filename) + 1;
1187       highbyte = *(p + offset++);
1188       flagbits = 0;
1189       flagbyte = 0;
1190       while (offset < end && filename_size < fn_end)
1191       {
1192         if (!flagbits)
1193         {
1194           flagbyte = *(p + offset++);
1195           flagbits = 8;
1196         }
1197         
1198         flagbits -= 2;
1199         switch((flagbyte >> flagbits) & 3)
1200         {
1201           case 0:
1202             filename[filename_size++] = '\0';
1203             filename[filename_size++] = *(p + offset++);
1204             break;
1205           case 1:
1206             filename[filename_size++] = highbyte;
1207             filename[filename_size++] = *(p + offset++);
1208             break;
1209           case 2:
1210             filename[filename_size++] = *(p + offset + 1);
1211             filename[filename_size++] = *(p + offset);
1212             offset += 2;
1213             break;
1214           case 3:
1215           {
1216             char extra, high;
1217             uint8_t length = *(p + offset++);
1218
1219             if (length & 0x80) {
1220               extra = *(p + offset++);
1221               high = (char)highbyte;
1222             } else
1223               extra = high = 0;
1224             length = (length & 0x7f) + 2;
1225             while (length && filename_size < fn_end) {
1226               unsigned cp = filename_size >> 1;
1227               filename[filename_size++] = high;
1228               filename[filename_size++] = p[cp] + extra;
1229               length--;
1230             }
1231           }
1232           break;
1233         }
1234       }
1235       if (filename_size > fn_end) {
1236         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1237           "Invalid filename");
1238         return (ARCHIVE_FATAL);
1239       }
1240       filename[filename_size++] = '\0';
1241       filename[filename_size++] = '\0';
1242
1243       /* Decoded unicode form is UTF-16BE, so we have to update a string
1244        * conversion object for it. */
1245       if (rar->sconv_utf16be == NULL) {
1246         rar->sconv_utf16be = archive_string_conversion_from_charset(
1247            &a->archive, "UTF-16BE", 1);
1248         if (rar->sconv_utf16be == NULL)
1249           return (ARCHIVE_FATAL);
1250       }
1251       fn_sconv = rar->sconv_utf16be;
1252
1253       strp = filename;
1254       while (memcmp(strp, "\x00\x00", 2))
1255       {
1256         if (!memcmp(strp, "\x00\\", 2))
1257           *(strp + 1) = '/';
1258         strp += 2;
1259       }
1260       p += offset;
1261     } else {
1262       /*
1263        * If FHD_UNICODE is set but no unicode data, this file name form
1264        * is UTF-8, so we have to update a string conversion object for
1265        * it accordingly.
1266        */
1267       if (rar->sconv_utf8 == NULL) {
1268         rar->sconv_utf8 = archive_string_conversion_from_charset(
1269            &a->archive, "UTF-8", 1);
1270         if (rar->sconv_utf8 == NULL)
1271           return (ARCHIVE_FATAL);
1272       }
1273       fn_sconv = rar->sconv_utf8;
1274       while ((strp = strchr(filename, '\\')) != NULL)
1275         *strp = '/';
1276       p += filename_size;
1277     }
1278   }
1279   else
1280   {
1281     fn_sconv = sconv;
1282     while ((strp = strchr(filename, '\\')) != NULL)
1283       *strp = '/';
1284     p += filename_size;
1285   }
1286
1287   if (rar->file_flags & FHD_SALT)
1288   {
1289     if (p + 8 > endp) {
1290       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1291         "Invalid header size");
1292       return (ARCHIVE_FATAL);
1293     }
1294     memcpy(rar->salt, p, 8);
1295     p += 8;
1296   }
1297
1298   if (rar->file_flags & FHD_EXTTIME) {
1299     if (read_exttime(p, rar, endp) < 0) {
1300       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1301         "Invalid header size");
1302       return (ARCHIVE_FATAL);
1303     }
1304   }
1305
1306   __archive_read_consume(a, header_size - 7);
1307
1308   switch(file_header.host_os)
1309   {
1310   case OS_MSDOS:
1311   case OS_OS2:
1312   case OS_WIN32:
1313     rar->mode = archive_le32dec(file_header.file_attr);
1314     if (rar->mode & FILE_ATTRIBUTE_DIRECTORY)
1315       rar->mode = AE_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
1316     else
1317       rar->mode = AE_IFREG;
1318     rar->mode |= S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
1319     break;
1320
1321   case OS_UNIX:
1322   case OS_MAC_OS:
1323   case OS_BEOS:
1324     rar->mode = archive_le32dec(file_header.file_attr);
1325     break;
1326
1327   default:
1328     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1329                       "Unknown file attributes from RAR file's host OS");
1330     return (ARCHIVE_FATAL);
1331   }
1332
1333   rar->bytes_remaining = rar->packed_size;
1334   rar->bytes_uncopied = rar->bytes_unconsumed = 0;
1335   rar->lzss.position = rar->offset = 0;
1336   rar->dictionary_size = 0;
1337   rar->offset_outgoing = 0;
1338   rar->br.cache_avail = 0;
1339   rar->br.avail_in = 0;
1340   rar->crc_calculated = 0;
1341   rar->entry_eof = 0;
1342   rar->valid = 1;
1343   rar->is_ppmd_block = 0;
1344   rar->start_new_table = 1;
1345   free(rar->unp_buffer);
1346   rar->unp_buffer = NULL;
1347   rar->unp_offset = 0;
1348   rar->unp_buffer_size = UNP_BUFFER_SIZE;
1349   memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
1350   __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
1351   rar->ppmd_valid = rar->ppmd_eod = 0;
1352
1353   /* Don't set any archive entries for non-file header types */
1354   if (head_type == NEWSUB_HEAD)
1355     return ret;
1356
1357   archive_entry_set_mtime(entry, rar->mtime, rar->mnsec);
1358   archive_entry_set_ctime(entry, rar->ctime, rar->cnsec);
1359   archive_entry_set_atime(entry, rar->atime, rar->ansec);
1360   archive_entry_set_size(entry, rar->unp_size);
1361   archive_entry_set_mode(entry, rar->mode);
1362
1363   if (archive_entry_copy_pathname_l(entry, filename, filename_size, fn_sconv))
1364   {
1365     if (errno == ENOMEM)
1366     {
1367       archive_set_error(&a->archive, ENOMEM,
1368                         "Can't allocate memory for Pathname");
1369       return (ARCHIVE_FATAL);
1370     }
1371     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1372                       "Pathname cannot be converted from %s to current locale.",
1373                       archive_string_conversion_charset_name(fn_sconv));
1374     ret = (ARCHIVE_WARN);
1375   }
1376
1377   if (((rar->mode) & AE_IFMT) == AE_IFLNK)
1378   {
1379     /* Make sure a symbolic-link file does not have its body. */
1380     rar->bytes_remaining = 0;
1381     archive_entry_set_size(entry, 0);
1382
1383     /* Read a symbolic-link name. */
1384     if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN))
1385       return ret2;
1386     if (ret > ret2)
1387       ret = ret2;
1388   }
1389
1390   if (rar->bytes_remaining == 0)
1391     rar->entry_eof = 1;
1392
1393   return ret;
1394 }
1395
1396 static time_t
1397 get_time(int ttime)
1398 {
1399   struct tm tm;
1400   tm.tm_sec = 2 * (ttime & 0x1f);
1401   tm.tm_min = (ttime >> 5) & 0x3f;
1402   tm.tm_hour = (ttime >> 11) & 0x1f;
1403   tm.tm_mday = (ttime >> 16) & 0x1f;
1404   tm.tm_mon = ((ttime >> 21) & 0x0f) - 1;
1405   tm.tm_year = ((ttime >> 25) & 0x7f) + 80;
1406   tm.tm_isdst = -1;
1407   return mktime(&tm);
1408 }
1409
1410 static int
1411 read_exttime(const char *p, struct rar *rar, const char *endp)
1412 {
1413   unsigned rmode, flags, rem, j, count;
1414   int ttime, i;
1415   struct tm *tm;
1416   time_t t;
1417   long nsec;
1418
1419   if (p + 2 > endp)
1420     return (-1);
1421   flags = archive_le16dec(p);
1422   p += 2;
1423
1424   for (i = 3; i >= 0; i--)
1425   {
1426     t = 0;
1427     if (i == 3)
1428       t = rar->mtime;
1429     rmode = flags >> i * 4;
1430     if (rmode & 8)
1431     {
1432       if (!t)
1433       {
1434         if (p + 4 > endp)
1435           return (-1);
1436         ttime = archive_le32dec(p);
1437         t = get_time(ttime);
1438         p += 4;
1439       }
1440       rem = 0;
1441       count = rmode & 3;
1442       if (p + count > endp)
1443         return (-1);
1444       for (j = 0; j < count; j++)
1445       {
1446         rem = ((*p) << 16) | (rem >> 8);
1447         p++;
1448       }
1449       tm = localtime(&t);
1450       nsec = tm->tm_sec + rem / NS_UNIT;
1451       if (rmode & 4)
1452       {
1453         tm->tm_sec++;
1454         t = mktime(tm);
1455       }
1456       if (i == 3)
1457       {
1458         rar->mtime = t;
1459         rar->mnsec = nsec;
1460       }
1461       else if (i == 2)
1462       {
1463         rar->ctime = t;
1464         rar->cnsec = nsec;
1465       }
1466       else if (i == 1)
1467       {
1468         rar->atime = t;
1469         rar->ansec = nsec;
1470       }
1471       else
1472       {
1473         rar->arctime = t;
1474         rar->arcnsec = nsec;
1475       }
1476     }
1477   }
1478   return (0);
1479 }
1480
1481 static int
1482 read_symlink_stored(struct archive_read *a, struct archive_entry *entry,
1483                     struct archive_string_conv *sconv)
1484 {
1485   const void *h;
1486   const char *p;
1487   struct rar *rar;
1488   int ret = (ARCHIVE_OK);
1489
1490   rar = (struct rar *)(a->format->data);
1491   if ((h = __archive_read_ahead(a, (size_t)rar->packed_size, NULL)) == NULL)
1492     return (ARCHIVE_FATAL);
1493   p = h;
1494
1495   if (archive_entry_copy_symlink_l(entry,
1496       p, (size_t)rar->packed_size, sconv))
1497   {
1498     if (errno == ENOMEM)
1499     {
1500       archive_set_error(&a->archive, ENOMEM,
1501                         "Can't allocate memory for link");
1502       return (ARCHIVE_FATAL);
1503     }
1504     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1505                       "link cannot be converted from %s to current locale.",
1506                       archive_string_conversion_charset_name(sconv));
1507     ret = (ARCHIVE_WARN);
1508   }
1509   __archive_read_consume(a, rar->packed_size);
1510   return ret;
1511 }
1512
1513 static int
1514 read_data_stored(struct archive_read *a, const void **buff, size_t *size,
1515                  int64_t *offset)
1516 {
1517   struct rar *rar;
1518   ssize_t bytes_avail;
1519
1520   rar = (struct rar *)(a->format->data);
1521   if (rar->bytes_remaining == 0)
1522   {
1523     *buff = NULL;
1524     *size = 0;
1525     *offset = rar->offset;
1526     if (rar->file_crc != rar->crc_calculated) {
1527       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1528                         "File CRC error");
1529       return (ARCHIVE_FATAL);
1530     }
1531     rar->entry_eof = 1;
1532     return (ARCHIVE_EOF);
1533   }
1534
1535   *buff = __archive_read_ahead(a, 1, &bytes_avail);
1536   if (bytes_avail <= 0)
1537   {
1538     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1539                       "Truncated RAR file data");
1540     return (ARCHIVE_FATAL);
1541   }
1542   if (bytes_avail > rar->bytes_remaining)
1543     bytes_avail = (ssize_t)rar->bytes_remaining;
1544
1545   *size = bytes_avail;
1546   *offset = rar->offset;
1547   rar->offset += bytes_avail;
1548   rar->bytes_remaining -= bytes_avail;
1549   rar->bytes_unconsumed = bytes_avail;
1550   /* Calculate File CRC. */
1551   rar->crc_calculated = crc32(rar->crc_calculated, *buff, bytes_avail);
1552   return (ARCHIVE_OK);
1553 }
1554
1555 static int
1556 read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
1557                int64_t *offset)
1558 {
1559   struct rar *rar;
1560   int64_t start, end, actualend;
1561   size_t bs;
1562   int ret = (ARCHIVE_OK), sym, code, lzss_offset, length, i;
1563
1564   rar = (struct rar *)(a->format->data);
1565
1566   do {
1567     if (!rar->valid)
1568       return (ARCHIVE_FATAL);
1569     if (rar->ppmd_eod ||
1570        (rar->dictionary_size && rar->offset >= rar->unp_size))
1571     {
1572       if (rar->unp_offset > 0) {
1573         /*
1574          * We have unprocessed extracted data. write it out.
1575          */
1576         *buff = rar->unp_buffer;
1577         *size = rar->unp_offset;
1578         *offset = rar->offset_outgoing;
1579         rar->offset_outgoing += *size;
1580         /* Calculate File CRC. */
1581         rar->crc_calculated = crc32(rar->crc_calculated, *buff, *size);
1582         rar->unp_offset = 0;
1583         return (ARCHIVE_OK);
1584       }
1585       *buff = NULL;
1586       *size = 0;
1587       *offset = rar->offset;
1588       if (rar->file_crc != rar->crc_calculated) {
1589         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1590                           "File CRC error");
1591         return (ARCHIVE_FATAL);
1592       }
1593       rar->entry_eof = 1;
1594       return (ARCHIVE_EOF);
1595     }
1596
1597     if (!rar->is_ppmd_block && rar->dictionary_size && rar->bytes_uncopied > 0)
1598     {
1599       if (rar->bytes_uncopied > (rar->unp_buffer_size - rar->unp_offset))
1600         bs = rar->unp_buffer_size - rar->unp_offset;
1601       else
1602         bs = (size_t)rar->bytes_uncopied;
1603       ret = copy_from_lzss_window(a, buff, rar->offset, bs);
1604       if (ret != ARCHIVE_OK)
1605         return (ret);
1606       rar->offset += bs;
1607       rar->bytes_uncopied -= bs;
1608       if (*buff != NULL) {
1609         rar->unp_offset = 0;
1610         *size = rar->unp_buffer_size;
1611         *offset = rar->offset_outgoing;
1612         rar->offset_outgoing += *size;
1613         /* Calculate File CRC. */
1614         rar->crc_calculated = crc32(rar->crc_calculated, *buff, *size);
1615         return (ret);
1616       }
1617       continue;
1618     }
1619
1620     if (!rar->br.next_in &&
1621       (ret = rar_br_preparation(a, &(rar->br))) < ARCHIVE_WARN)
1622       return (ret);
1623     if (rar->start_new_table && ((ret = parse_codes(a)) < (ARCHIVE_WARN)))
1624       return (ret);
1625
1626     if (rar->is_ppmd_block)
1627     {
1628       if ((sym = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1629         &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1630       {
1631         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1632                           "Invalid symbol");
1633         return (ARCHIVE_FATAL);
1634       }
1635       if(sym != rar->ppmd_escape)
1636       {
1637         lzss_emit_literal(rar, sym);
1638         rar->bytes_uncopied++;
1639       }
1640       else
1641       {
1642         if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1643           &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1644         {
1645           archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1646                             "Invalid symbol");
1647           return (ARCHIVE_FATAL);
1648         }
1649
1650         switch(code)
1651         {
1652           case 0:
1653             rar->start_new_table = 1;
1654             return read_data_compressed(a, buff, size, offset);
1655
1656           case 2:
1657             rar->ppmd_eod = 1;/* End Of ppmd Data. */
1658             continue;
1659
1660           case 3:
1661             archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1662                               "Parsing filters is unsupported.");
1663             return (ARCHIVE_FAILED);
1664
1665           case 4:
1666             lzss_offset = 0;
1667             for (i = 2; i >= 0; i--)
1668             {
1669               if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1670                 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1671               {
1672                 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1673                                   "Invalid symbol");
1674                 return (ARCHIVE_FATAL);
1675               }
1676               lzss_offset |= code << (i * 8);
1677             }
1678             if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1679               &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1680             {
1681               archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1682                                 "Invalid symbol");
1683               return (ARCHIVE_FATAL);
1684             }
1685             lzss_emit_match(rar, lzss_offset + 2, length + 32);
1686             rar->bytes_uncopied += length + 32;
1687             break;
1688
1689           case 5:
1690             if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1691               &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1692             {
1693               archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1694                                 "Invalid symbol");
1695               return (ARCHIVE_FATAL);
1696             }
1697             lzss_emit_match(rar, 1, length + 4);
1698             rar->bytes_uncopied += length + 4;
1699             break;
1700
1701          default:
1702            lzss_emit_literal(rar, sym);
1703            rar->bytes_uncopied++;
1704         }
1705       }
1706     }
1707     else
1708     {
1709       start = rar->offset;
1710       end = start + rar->dictionary_size;
1711       rar->filterstart = INT64_MAX;
1712
1713       if ((actualend = expand(a, end)) < 0)
1714         return ((int)actualend);
1715
1716       rar->bytes_uncopied = actualend - start;
1717       if (rar->bytes_uncopied == 0) {
1718           /* Broken RAR files cause this case.
1719           * NOTE: If this case were possible on a normal RAR file
1720           * we would find out where it was actually bad and
1721           * what we would do to solve it. */
1722           archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1723                             "Internal error extracting RAR file");
1724           return (ARCHIVE_FATAL);
1725       }
1726     }
1727     if (rar->bytes_uncopied > (rar->unp_buffer_size - rar->unp_offset))
1728       bs = rar->unp_buffer_size - rar->unp_offset;
1729     else
1730       bs = (size_t)rar->bytes_uncopied;
1731     ret = copy_from_lzss_window(a, buff, rar->offset, bs);
1732     if (ret != ARCHIVE_OK)
1733       return (ret);
1734     rar->offset += bs;
1735     rar->bytes_uncopied -= bs;
1736     /*
1737      * If *buff is NULL, it means unp_buffer is not full.
1738      * So we have to continue extracting a RAR file.
1739      */
1740   } while (*buff == NULL);
1741
1742   rar->unp_offset = 0;
1743   *size = rar->unp_buffer_size;
1744   *offset = rar->offset_outgoing;
1745   rar->offset_outgoing += *size;
1746   /* Calculate File CRC. */
1747   rar->crc_calculated = crc32(rar->crc_calculated, *buff, *size);
1748   return ret;
1749 }
1750
1751 static int
1752 parse_codes(struct archive_read *a)
1753 {
1754   int i, j, val, n, r;
1755   unsigned char bitlengths[MAX_SYMBOLS], zerocount, ppmd_flags;
1756   unsigned int maxorder;
1757   struct huffman_code precode;
1758   struct rar *rar = (struct rar *)(a->format->data);
1759   struct rar_br *br = &(rar->br);
1760
1761   free_codes(a);
1762
1763   /* Skip to the next byte */
1764   rar_br_consume_unalined_bits(br);
1765
1766   /* PPMd block flag */
1767   if (!rar_br_read_ahead(a, br, 1))
1768     goto truncated_data;
1769   if ((rar->is_ppmd_block = rar_br_bits(br, 1)) != 0)
1770   {
1771     rar_br_consume(br, 1);
1772     if (!rar_br_read_ahead(a, br, 7))
1773       goto truncated_data;
1774     ppmd_flags = rar_br_bits(br, 7);
1775     rar_br_consume(br, 7);
1776
1777     /* Memory is allocated in MB */
1778     if (ppmd_flags & 0x20)
1779     {
1780       if (!rar_br_read_ahead(a, br, 8))
1781         goto truncated_data;
1782       rar->dictionary_size = (rar_br_bits(br, 8) + 1) << 20;
1783       rar_br_consume(br, 8);
1784     }
1785
1786     if (ppmd_flags & 0x40)
1787     {
1788       if (!rar_br_read_ahead(a, br, 8))
1789         goto truncated_data;
1790       rar->ppmd_escape = rar->ppmd7_context.InitEsc = rar_br_bits(br, 8);
1791       rar_br_consume(br, 8);
1792     }
1793     else
1794       rar->ppmd_escape = 2;
1795
1796     if (ppmd_flags & 0x20)
1797     {
1798       maxorder = (ppmd_flags & 0x1F) + 1;
1799       if(maxorder > 16)
1800         maxorder = 16 + (maxorder - 16) * 3;
1801
1802       if (maxorder == 1)
1803       {
1804         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1805                           "Truncated RAR file data");
1806         return (ARCHIVE_FATAL);
1807       }
1808
1809       /* Make sure ppmd7_contest is freed before Ppmd7_Construct
1810        * because reading a broken file cause this abnormal sequence. */
1811       __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
1812
1813       rar->bytein.a = a;
1814       rar->bytein.Read = &ppmd_read;
1815       __archive_ppmd7_functions.PpmdRAR_RangeDec_CreateVTable(&rar->range_dec);
1816       rar->range_dec.Stream = &rar->bytein;
1817       __archive_ppmd7_functions.Ppmd7_Construct(&rar->ppmd7_context);
1818
1819       if (!__archive_ppmd7_functions.Ppmd7_Alloc(&rar->ppmd7_context,
1820         rar->dictionary_size, &g_szalloc))
1821       {
1822         archive_set_error(&a->archive, ENOMEM,
1823                           "Out of memory");
1824         return (ARCHIVE_FATAL);
1825       }
1826       if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
1827       {
1828         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1829                           "Unable to initialize PPMd range decoder");
1830         return (ARCHIVE_FATAL);
1831       }
1832       __archive_ppmd7_functions.Ppmd7_Init(&rar->ppmd7_context, maxorder);
1833       rar->ppmd_valid = 1;
1834     }
1835     else
1836     {
1837       if (!rar->ppmd_valid) {
1838         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1839                           "Invalid PPMd sequence");
1840         return (ARCHIVE_FATAL);
1841       }
1842       if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
1843       {
1844         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1845                           "Unable to initialize PPMd range decoder");
1846         return (ARCHIVE_FATAL);
1847       }
1848     }
1849   }
1850   else
1851   {
1852     rar_br_consume(br, 1);
1853
1854     /* Keep existing table flag */
1855     if (!rar_br_read_ahead(a, br, 1))
1856       goto truncated_data;
1857     if (!rar_br_bits(br, 1))
1858       memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
1859     rar_br_consume(br, 1);
1860
1861     memset(&bitlengths, 0, sizeof(bitlengths));
1862     for (i = 0; i < MAX_SYMBOLS;)
1863     {
1864       if (!rar_br_read_ahead(a, br, 4))
1865         goto truncated_data;
1866       bitlengths[i++] = rar_br_bits(br, 4);
1867       rar_br_consume(br, 4);
1868       if (bitlengths[i-1] == 0xF)
1869       {
1870         if (!rar_br_read_ahead(a, br, 4))
1871           goto truncated_data;
1872         zerocount = rar_br_bits(br, 4);
1873         rar_br_consume(br, 4);
1874         if (zerocount)
1875         {
1876           i--;
1877           for (j = 0; j < zerocount + 2 && i < MAX_SYMBOLS; j++)
1878             bitlengths[i++] = 0;
1879         }
1880       }
1881     }
1882
1883     memset(&precode, 0, sizeof(precode));
1884     r = create_code(a, &precode, bitlengths, MAX_SYMBOLS, MAX_SYMBOL_LENGTH);
1885     if (r != ARCHIVE_OK) {
1886       free(precode.tree);
1887       free(precode.table);
1888       return (r);
1889     }
1890
1891     for (i = 0; i < HUFFMAN_TABLE_SIZE;)
1892     {
1893       if ((val = read_next_symbol(a, &precode)) < 0) {
1894         free(precode.tree);
1895         free(precode.table);
1896         return (ARCHIVE_FATAL);
1897       }
1898       if (val < 16)
1899       {
1900         rar->lengthtable[i] = (rar->lengthtable[i] + val) & 0xF;
1901         i++;
1902       }
1903       else if (val < 18)
1904       {
1905         if (i == 0)
1906         {
1907           free(precode.tree);
1908           free(precode.table);
1909           archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1910                             "Internal error extracting RAR file.");
1911           return (ARCHIVE_FATAL);
1912         }
1913
1914         if(val == 16) {
1915           if (!rar_br_read_ahead(a, br, 3)) {
1916             free(precode.tree);
1917             free(precode.table);
1918             goto truncated_data;
1919           }
1920           n = rar_br_bits(br, 3) + 3;
1921           rar_br_consume(br, 3);
1922         } else {
1923           if (!rar_br_read_ahead(a, br, 7)) {
1924             free(precode.tree);
1925             free(precode.table);
1926             goto truncated_data;
1927           }
1928           n = rar_br_bits(br, 7) + 11;
1929           rar_br_consume(br, 7);
1930         }
1931
1932         for (j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
1933         {
1934           rar->lengthtable[i] = rar->lengthtable[i-1];
1935           i++;
1936         }
1937       }
1938       else
1939       {
1940         if(val == 18) {
1941           if (!rar_br_read_ahead(a, br, 3)) {
1942             free(precode.tree);
1943             free(precode.table);
1944             goto truncated_data;
1945           }
1946           n = rar_br_bits(br, 3) + 3;
1947           rar_br_consume(br, 3);
1948         } else {
1949           if (!rar_br_read_ahead(a, br, 7)) {
1950             free(precode.tree);
1951             free(precode.table);
1952             goto truncated_data;
1953           }
1954           n = rar_br_bits(br, 7) + 11;
1955           rar_br_consume(br, 7);
1956         }
1957
1958         for(j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
1959           rar->lengthtable[i++] = 0;
1960       }
1961     }
1962     free(precode.tree);
1963     free(precode.table);
1964
1965     r = create_code(a, &rar->maincode, &rar->lengthtable[0], MAINCODE_SIZE,
1966                 MAX_SYMBOL_LENGTH);
1967     if (r != ARCHIVE_OK)
1968       return (r);
1969     r = create_code(a, &rar->offsetcode, &rar->lengthtable[MAINCODE_SIZE],
1970                 OFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
1971     if (r != ARCHIVE_OK)
1972       return (r);
1973     r = create_code(a, &rar->lowoffsetcode,
1974                 &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE],
1975                 LOWOFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
1976     if (r != ARCHIVE_OK)
1977       return (r);
1978     r = create_code(a, &rar->lengthcode,
1979                 &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE +
1980                 LOWOFFSETCODE_SIZE], LENGTHCODE_SIZE, MAX_SYMBOL_LENGTH);
1981     if (r != ARCHIVE_OK)
1982       return (r);
1983   }
1984
1985   if (!rar->dictionary_size || !rar->lzss.window)
1986   {
1987     /* Seems as though dictionary sizes are not used. Even so, minimize
1988      * memory usage as much as possible.
1989      */
1990     if (rar->unp_size >= DICTIONARY_MAX_SIZE)
1991       rar->dictionary_size = DICTIONARY_MAX_SIZE;
1992     else
1993       rar->dictionary_size = rar_fls((unsigned int)rar->unp_size) << 1;
1994     rar->lzss.window = (unsigned char *)realloc(rar->lzss.window,
1995                                                 rar->dictionary_size);
1996     if (rar->lzss.window == NULL) {
1997       archive_set_error(&a->archive, ENOMEM,
1998                         "Unable to allocate memory for uncompressed data.");
1999       return (ARCHIVE_FATAL);
2000     }
2001     memset(rar->lzss.window, 0, rar->dictionary_size);
2002     rar->lzss.mask = rar->dictionary_size - 1;
2003   }
2004
2005   rar->start_new_table = 0;
2006   return (ARCHIVE_OK);
2007 truncated_data:
2008   archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2009                     "Truncated RAR file data");
2010   rar->valid = 0;
2011   return (ARCHIVE_FATAL);
2012 }
2013
2014 static void
2015 free_codes(struct archive_read *a)
2016 {
2017   struct rar *rar = (struct rar *)(a->format->data);
2018   free(rar->maincode.tree);
2019   free(rar->offsetcode.tree);
2020   free(rar->lowoffsetcode.tree);
2021   free(rar->lengthcode.tree);
2022   free(rar->maincode.table);
2023   free(rar->offsetcode.table);
2024   free(rar->lowoffsetcode.table);
2025   free(rar->lengthcode.table);
2026   memset(&rar->maincode, 0, sizeof(rar->maincode));
2027   memset(&rar->offsetcode, 0, sizeof(rar->offsetcode));
2028   memset(&rar->lowoffsetcode, 0, sizeof(rar->lowoffsetcode));
2029   memset(&rar->lengthcode, 0, sizeof(rar->lengthcode));
2030 }
2031
2032
2033 static int
2034 read_next_symbol(struct archive_read *a, struct huffman_code *code)
2035 {
2036   unsigned char bit;
2037   unsigned int bits;
2038   int length, value, node;
2039   struct rar *rar;
2040   struct rar_br *br;
2041
2042   if (!code->table)
2043   {
2044     if (make_table(a, code) != (ARCHIVE_OK))
2045       return -1;
2046   }
2047
2048   rar = (struct rar *)(a->format->data);
2049   br = &(rar->br);
2050
2051   /* Look ahead (peek) at bits */
2052   if (!rar_br_read_ahead(a, br, code->tablesize)) {
2053     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2054                       "Truncated RAR file data");
2055     rar->valid = 0;
2056     return -1;
2057   }
2058   bits = rar_br_bits(br, code->tablesize);
2059
2060   length = code->table[bits].length;
2061   value = code->table[bits].value;
2062
2063   if (length < 0)
2064   {
2065     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2066                       "Invalid prefix code in bitstream");
2067     return -1;
2068   }
2069
2070   if (length <= code->tablesize)
2071   {
2072     /* Skip length bits */
2073     rar_br_consume(br, length);
2074     return value;
2075   }
2076
2077   /* Skip tablesize bits */
2078   rar_br_consume(br, code->tablesize);
2079
2080   node = value;
2081   while (!(code->tree[node].branches[0] ==
2082     code->tree[node].branches[1]))
2083   {
2084     if (!rar_br_read_ahead(a, br, 1)) {
2085       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2086                         "Truncated RAR file data");
2087       rar->valid = 0;
2088       return -1;
2089     }
2090     bit = rar_br_bits(br, 1);
2091     rar_br_consume(br, 1);
2092
2093     if (code->tree[node].branches[bit] < 0)
2094     {
2095       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2096                         "Invalid prefix code in bitstream");
2097       return -1;
2098     }
2099     node = code->tree[node].branches[bit];
2100   }
2101
2102   return code->tree[node].branches[0];
2103 }
2104
2105 static int
2106 create_code(struct archive_read *a, struct huffman_code *code,
2107             unsigned char *lengths, int numsymbols, char maxlength)
2108 {
2109   int i, j, codebits = 0, symbolsleft = numsymbols;
2110
2111   if (new_node(code) < 0) {
2112     archive_set_error(&a->archive, ENOMEM,
2113                       "Unable to allocate memory for node data.");
2114     return (ARCHIVE_FATAL);
2115   }
2116   code->numentries = 1;
2117   code->minlength = INT_MAX;
2118   code->maxlength = INT_MIN;
2119   codebits = 0;
2120   for(i = 1; i <= maxlength; i++)
2121   {
2122     for(j = 0; j < numsymbols; j++)
2123     {
2124       if (lengths[j] != i) continue;
2125       if (add_value(a, code, j, codebits, i) != ARCHIVE_OK)
2126         return (ARCHIVE_FATAL);
2127       codebits++;
2128       if (--symbolsleft <= 0) { break; break; }
2129     }
2130     codebits <<= 1;
2131   }
2132   return (ARCHIVE_OK);
2133 }
2134
2135 static int
2136 add_value(struct archive_read *a, struct huffman_code *code, int value,
2137           int codebits, int length)
2138 {
2139   int repeatpos, lastnode, bitpos, bit, repeatnode, nextnode;
2140
2141   free(code->table);
2142   code->table = NULL;
2143
2144   if(length > code->maxlength)
2145     code->maxlength = length;
2146   if(length < code->minlength)
2147     code->minlength = length;
2148
2149   repeatpos = -1;
2150   if (repeatpos == 0 || (repeatpos >= 0
2151     && (((codebits >> (repeatpos - 1)) & 3) == 0
2152     || ((codebits >> (repeatpos - 1)) & 3) == 3)))
2153   {
2154     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2155                       "Invalid repeat position");
2156     return (ARCHIVE_FATAL);
2157   }
2158
2159   lastnode = 0;
2160   for (bitpos = length - 1; bitpos >= 0; bitpos--)
2161   {
2162     bit = (codebits >> bitpos) & 1;
2163
2164     /* Leaf node check */
2165     if (code->tree[lastnode].branches[0] ==
2166       code->tree[lastnode].branches[1])
2167     {
2168       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2169                         "Prefix found");
2170       return (ARCHIVE_FATAL);
2171     }
2172
2173     if (bitpos == repeatpos)
2174     {
2175       /* Open branch check */
2176       if (!(code->tree[lastnode].branches[bit] < 0))
2177       {
2178         archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2179                           "Invalid repeating code");
2180         return (ARCHIVE_FATAL);
2181       }
2182
2183       if ((repeatnode = new_node(code)) < 0) {
2184         archive_set_error(&a->archive, ENOMEM,
2185                           "Unable to allocate memory for node data.");
2186         return (ARCHIVE_FATAL);
2187       }
2188       if ((nextnode = new_node(code)) < 0) {
2189         archive_set_error(&a->archive, ENOMEM,
2190                           "Unable to allocate memory for node data.");
2191         return (ARCHIVE_FATAL);
2192       }
2193
2194       /* Set branches */
2195       code->tree[lastnode].branches[bit] = repeatnode;
2196       code->tree[repeatnode].branches[bit] = repeatnode;
2197       code->tree[repeatnode].branches[bit^1] = nextnode;
2198       lastnode = nextnode;
2199
2200       bitpos++; /* terminating bit already handled, skip it */
2201     }
2202     else
2203     {
2204       /* Open branch check */
2205       if (code->tree[lastnode].branches[bit] < 0)
2206       {
2207         if (new_node(code) < 0) {
2208           archive_set_error(&a->archive, ENOMEM,
2209                             "Unable to allocate memory for node data.");
2210           return (ARCHIVE_FATAL);
2211         }
2212         code->tree[lastnode].branches[bit] = code->numentries++;
2213       }
2214
2215       /* set to branch */
2216       lastnode = code->tree[lastnode].branches[bit];
2217     }
2218   }
2219
2220   if (!(code->tree[lastnode].branches[0] == -1
2221     && code->tree[lastnode].branches[1] == -2))
2222   {
2223     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2224                       "Prefix found");
2225     return (ARCHIVE_FATAL);
2226   }
2227
2228   /* Set leaf value */
2229   code->tree[lastnode].branches[0] = value;
2230   code->tree[lastnode].branches[1] = value;
2231
2232   return (ARCHIVE_OK);
2233 }
2234
2235 static int
2236 new_node(struct huffman_code *code)
2237 {
2238   code->tree = (struct huffman_tree_node *)realloc(code->tree,
2239     (code->numentries + 1) * sizeof(*code->tree));
2240   if (code->tree == NULL)
2241     return (-1);
2242   code->tree[code->numentries].branches[0] = -1;
2243   code->tree[code->numentries].branches[1] = -2;
2244   return 1;
2245 }
2246
2247 static int
2248 make_table(struct archive_read *a, struct huffman_code *code)
2249 {
2250   if (code->maxlength < code->minlength || code->maxlength > 10)
2251     code->tablesize = 10;
2252   else
2253     code->tablesize = code->maxlength;
2254
2255   code->table =
2256     (struct huffman_table_entry *)malloc(sizeof(*code->table)
2257     * (1 << code->tablesize));
2258
2259   return make_table_recurse(a, code, 0, code->table, 0, code->tablesize);
2260 }
2261
2262 static int
2263 make_table_recurse(struct archive_read *a, struct huffman_code *code, int node,
2264                    struct huffman_table_entry *table, int depth,
2265                    int maxdepth)
2266 {
2267   int currtablesize, i, ret = (ARCHIVE_OK);
2268
2269   if (!code->tree)
2270   {
2271     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2272                       "Huffman tree was not created.");
2273     return (ARCHIVE_FATAL);
2274   }
2275   if (node < 0 || node >= code->numentries)
2276   {
2277     archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2278                       "Invalid location to Huffman tree specified.");
2279     return (ARCHIVE_FATAL);
2280   }
2281
2282   currtablesize = 1 << (maxdepth - depth);
2283
2284   if (code->tree[node].branches[0] ==
2285     code->tree[node].branches[1])
2286   {
2287     for(i = 0; i < currtablesize; i++)
2288     {
2289       table[i].length = depth;
2290       table[i].value = code->tree[node].branches[0];
2291     }
2292   }
2293   else if (node < 0)
2294   {
2295     for(i = 0; i < currtablesize; i++)
2296       table[i].length = -1;
2297   }
2298   else
2299   {
2300     if(depth == maxdepth)
2301     {
2302       table[0].length = maxdepth + 1;
2303       table[0].value = node;
2304     }
2305     else
2306     {
2307       ret |= make_table_recurse(a, code, code->tree[node].branches[0], table,
2308                                 depth + 1, maxdepth);
2309       ret |= make_table_recurse(a, code, code->tree[node].branches[1],
2310                          table + currtablesize / 2, depth + 1, maxdepth);
2311     }
2312   }
2313   return ret;
2314 }
2315
2316 static int64_t
2317 expand(struct archive_read *a, int64_t end)
2318 {
2319   static const unsigned char lengthbases[] =
2320     {   0,   1,   2,   3,   4,   5,   6,
2321         7,   8,  10,  12,  14,  16,  20,
2322        24,  28,  32,  40,  48,  56,  64,
2323        80,  96, 112, 128, 160, 192, 224 };
2324   static const unsigned char lengthbits[] =
2325     { 0, 0, 0, 0, 0, 0, 0,
2326       0, 1, 1, 1, 1, 2, 2,
2327       2, 2, 3, 3, 3, 3, 4,
2328       4, 4, 4, 5, 5, 5, 5 };
2329   static const unsigned int offsetbases[] =
2330     {       0,       1,       2,       3,       4,       6,
2331             8,      12,      16,      24,      32,      48,
2332            64,      96,     128,     192,     256,     384,
2333           512,     768,    1024,    1536,    2048,    3072,
2334          4096,    6144,    8192,   12288,   16384,   24576,
2335         32768,   49152,   65536,   98304,  131072,  196608,
2336        262144,  327680,  393216,  458752,  524288,  589824,
2337        655360,  720896,  786432,  851968,  917504,  983040,
2338       1048576, 1310720, 1572864, 1835008, 2097152, 2359296,
2339       2621440, 2883584, 3145728, 3407872, 3670016, 3932160 };
2340   static const unsigned char offsetbits[] =
2341     {  0,  0,  0,  0,  1,  1,  2,  2,  3,  3,  4,  4,
2342        5,  5,  6,  6,  7,  7,  8,  8,  9,  9, 10, 10,
2343       11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
2344       16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
2345       18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 };
2346   static const unsigned char shortbases[] =
2347     { 0, 4, 8, 16, 32, 64, 128, 192 };
2348   static const unsigned char shortbits[] =
2349     { 2, 2, 3, 4, 5, 6, 6, 6 };
2350
2351   int symbol, offs, len, offsindex, lensymbol, i, offssymbol, lowoffsetsymbol;
2352   unsigned char newfile;
2353   struct rar *rar = (struct rar *)(a->format->data);
2354   struct rar_br *br = &(rar->br);
2355
2356   if (rar->filterstart < end)
2357     end = rar->filterstart;
2358
2359   while (1)
2360   {
2361     if (rar->output_last_match &&
2362       lzss_position(&rar->lzss) + rar->lastlength <= end)
2363     {
2364       lzss_emit_match(rar, rar->lastoffset, rar->lastlength);
2365       rar->output_last_match = 0;
2366     }
2367
2368     if(rar->is_ppmd_block || rar->output_last_match ||
2369       lzss_position(&rar->lzss) >= end)
2370       return lzss_position(&rar->lzss);
2371
2372     if ((symbol = read_next_symbol(a, &rar->maincode)) < 0)
2373       return (ARCHIVE_FATAL);
2374     rar->output_last_match = 0;
2375     
2376     if (symbol < 256)
2377     {
2378       lzss_emit_literal(rar, symbol);
2379       continue;
2380     }
2381     else if (symbol == 256)
2382     {
2383       if (!rar_br_read_ahead(a, br, 1))
2384         goto truncated_data;
2385       newfile = !rar_br_bits(br, 1);
2386       rar_br_consume(br, 1);
2387
2388       if(newfile)
2389       {
2390         rar->start_new_block = 1;
2391         if (!rar_br_read_ahead(a, br, 1))
2392           goto truncated_data;
2393         rar->start_new_table = rar_br_bits(br, 1);
2394         rar_br_consume(br, 1);
2395         return lzss_position(&rar->lzss);
2396       }
2397       else
2398       {
2399         if (parse_codes(a) != ARCHIVE_OK)
2400           return (ARCHIVE_FATAL);
2401         continue;
2402       }
2403     }
2404     else if(symbol==257)
2405     {
2406       archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
2407                         "Parsing filters is unsupported.");
2408       return (ARCHIVE_FAILED);
2409     }
2410     else if(symbol==258)
2411     {
2412       if(rar->lastlength == 0)
2413         continue;
2414
2415       offs = rar->lastoffset;
2416       len = rar->lastlength;
2417     }
2418     else if (symbol <= 262)
2419     {
2420       offsindex = symbol - 259;
2421       offs = rar->oldoffset[offsindex];
2422
2423       if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
2424         goto bad_data;
2425       if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
2426         goto bad_data;
2427       if (lensymbol > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
2428         goto bad_data;
2429       len = lengthbases[lensymbol] + 2;
2430       if (lengthbits[lensymbol] > 0) {
2431         if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
2432           goto truncated_data;
2433         len += rar_br_bits(br, lengthbits[lensymbol]);
2434         rar_br_consume(br, lengthbits[lensymbol]);
2435       }
2436
2437       for (i = offsindex; i > 0; i--)
2438         rar->oldoffset[i] = rar->oldoffset[i-1];
2439       rar->oldoffset[0] = offs;
2440     }
2441     else if(symbol<=270)
2442     {
2443       offs = shortbases[symbol-263] + 1;
2444       if(shortbits[symbol-263] > 0) {
2445         if (!rar_br_read_ahead(a, br, shortbits[symbol-263]))
2446           goto truncated_data;
2447         offs += rar_br_bits(br, shortbits[symbol-263]);
2448         rar_br_consume(br, shortbits[symbol-263]);
2449       }
2450
2451       len = 2;
2452
2453       for(i = 3; i > 0; i--)
2454         rar->oldoffset[i] = rar->oldoffset[i-1];
2455       rar->oldoffset[0] = offs;
2456     }
2457     else
2458     {
2459       if (symbol-271 > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
2460         goto bad_data;
2461       if (symbol-271 > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
2462         goto bad_data;
2463       len = lengthbases[symbol-271]+3;
2464       if(lengthbits[symbol-271] > 0) {
2465         if (!rar_br_read_ahead(a, br, lengthbits[symbol-271]))
2466           goto truncated_data;
2467         len += rar_br_bits(br, lengthbits[symbol-271]);
2468         rar_br_consume(br, lengthbits[symbol-271]);
2469       }
2470
2471       if ((offssymbol = read_next_symbol(a, &rar->offsetcode)) < 0)
2472         goto bad_data;
2473       if (offssymbol > (int)(sizeof(offsetbases)/sizeof(offsetbases[0])))
2474         goto bad_data;
2475       if (offssymbol > (int)(sizeof(offsetbits)/sizeof(offsetbits[0])))
2476         goto bad_data;
2477       offs = offsetbases[offssymbol]+1;
2478       if(offsetbits[offssymbol] > 0)
2479       {
2480         if(offssymbol > 9)
2481         {
2482           if(offsetbits[offssymbol] > 4) {
2483             if (!rar_br_read_ahead(a, br, offsetbits[offssymbol] - 4))
2484               goto truncated_data;
2485             offs += rar_br_bits(br, offsetbits[offssymbol] - 4) << 4;
2486             rar_br_consume(br, offsetbits[offssymbol] - 4);
2487           }
2488
2489           if(rar->numlowoffsetrepeats > 0)
2490           {
2491             rar->numlowoffsetrepeats--;
2492             offs += rar->lastlowoffset;
2493           }
2494           else
2495           {
2496             if ((lowoffsetsymbol =
2497               read_next_symbol(a, &rar->lowoffsetcode)) < 0)
2498               return (ARCHIVE_FATAL);
2499             if(lowoffsetsymbol == 16)
2500             {
2501               rar->numlowoffsetrepeats = 15;
2502               offs += rar->lastlowoffset;
2503             }
2504             else
2505             {
2506               offs += lowoffsetsymbol;
2507               rar->lastlowoffset = lowoffsetsymbol;
2508             }
2509           }
2510         }
2511         else {
2512           if (!rar_br_read_ahead(a, br, offsetbits[offssymbol]))
2513             goto truncated_data;
2514           offs += rar_br_bits(br, offsetbits[offssymbol]);
2515           rar_br_consume(br, offsetbits[offssymbol]);
2516         }
2517       }
2518
2519       if (offs >= 0x40000)
2520         len++;
2521       if (offs >= 0x2000)
2522         len++;
2523
2524       for(i = 3; i > 0; i--)
2525         rar->oldoffset[i] = rar->oldoffset[i-1];
2526       rar->oldoffset[0] = offs;
2527     }
2528
2529     rar->lastoffset = offs;
2530     rar->lastlength = len;
2531     rar->output_last_match = 1;
2532   }
2533 truncated_data:
2534   archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2535                     "Truncated RAR file data");
2536   rar->valid = 0;
2537   return (ARCHIVE_FATAL);
2538 bad_data:
2539   archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2540                     "Bad RAR file data");
2541   return (ARCHIVE_FATAL);
2542 }
2543
2544 static int
2545 copy_from_lzss_window(struct archive_read *a, const void **buffer,
2546                         int64_t startpos, int length)
2547 {
2548   int windowoffs, firstpart;
2549   struct rar *rar = (struct rar *)(a->format->data);
2550
2551   if (!rar->unp_buffer)
2552   {
2553     if ((rar->unp_buffer = malloc(rar->unp_buffer_size)) == NULL)
2554     {
2555       archive_set_error(&a->archive, ENOMEM,
2556                         "Unable to allocate memory for uncompressed data.");
2557       return (ARCHIVE_FATAL);
2558     }
2559   }
2560
2561   windowoffs = lzss_offset_for_position(&rar->lzss, startpos);
2562   if(windowoffs + length <= lzss_size(&rar->lzss))
2563     memcpy(&rar->unp_buffer[rar->unp_offset], &rar->lzss.window[windowoffs],
2564            length);
2565   else
2566   {
2567     firstpart = lzss_size(&rar->lzss) - windowoffs;
2568     if (firstpart < 0) {
2569       archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2570                         "Bad RAR file data");
2571       return (ARCHIVE_FATAL);
2572     }
2573     if (firstpart < length) {
2574       memcpy(&rar->unp_buffer[rar->unp_offset],
2575              &rar->lzss.window[windowoffs], firstpart);
2576       memcpy(&rar->unp_buffer[rar->unp_offset + firstpart],
2577              &rar->lzss.window[0], length - firstpart);
2578     } else
2579       memcpy(&rar->unp_buffer[rar->unp_offset],
2580              &rar->lzss.window[windowoffs], length);
2581   }
2582   rar->unp_offset += length;
2583   if (rar->unp_offset >= rar->unp_buffer_size)
2584     *buffer = rar->unp_buffer;
2585   else
2586     *buffer = NULL;
2587   return (ARCHIVE_OK);
2588 }