2 * Copyright (c) 2003-2007 Tim Kientzle
3 * Copyright (c) 2011 Andres Mejia
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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.
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.
27 #include "archive_platform.h"
35 #include <zlib.h> /* crc32 */
40 #include "archive_crc32.h"
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"
49 /* RAR signature, also known as the mark header */
50 #define RAR_SIGNATURE "\x52\x61\x72\x21\x1A\x07\x00"
53 #define MARK_HEAD 0x72
54 #define MAIN_HEAD 0x73
55 #define FILE_HEAD 0x74
56 #define COMM_HEAD 0x75
59 #define PROTECT_HEAD 0x78
60 #define SIGN_HEAD 0x79
61 #define NEWSUB_HEAD 0x7a
62 #define ENDARC_HEAD 0x7b
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
71 #define MHD_PROTECT 0x0040
72 #define MHD_PASSWORD 0x0080
73 #define MHD_FIRSTVOLUME 0x0100
74 #define MHD_ENCRYPTVER 0x0200
76 /* Flags common to all headers */
77 #define HD_MARKDELETION 0x4000
78 #define HD_ADD_SIZE_PRESENT 0x8000
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
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
112 /* Compression Methods */
113 #define COMPRESS_METHOD_STORE 0x30
115 #define COMPRESS_METHOD_FASTEST 0x31
116 #define COMPRESS_METHOD_FAST 0x32
117 #define COMPRESS_METHOD_NORMAL 0x33
119 #define COMPRESS_METHOD_GOOD 0x34
120 #define COMPRESS_METHOD_BEST 0x35
122 #define CRC_POLYNOMIAL 0xEDB88320
124 #define NS_UNIT 10000000
126 #define DICTIONARY_MAX_SIZE 0x400000
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
135 #define MAX_SYMBOL_LENGTH 0xF
136 #define MAX_SYMBOLS 20
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.
144 #define UNP_BUFFER_SIZE (128 * 1024)
146 /* Define this here for non-Windows platforms */
147 #if !((defined(__WIN32__) || defined(_WIN32) || defined(__WIN32)) && !defined(__CYGWIN__))
148 #define FILE_ATTRIBUTE_DIRECTORY 0x10
151 /* Fields common to all headers */
160 /* Fields common to all file headers */
161 struct rar_file_header
174 struct huffman_tree_node
179 struct huffman_table_entry
187 struct huffman_tree_node *tree;
189 int numallocatedentries;
193 struct huffman_table_entry *table;
198 unsigned char *window;
203 struct data_block_offsets
206 int64_t start_offset;
212 /* Entries from main RAR header */
214 unsigned long file_crc;
219 /* File header entries */
220 char compression_method;
229 size_t filename_save_size;
230 size_t filename_allocated;
232 /* File header optional entries */
241 /* Fields to help with tracking decompression of files. */
242 int64_t bytes_unconsumed;
243 int64_t bytes_remaining;
244 int64_t bytes_uncopied;
246 int64_t offset_outgoing;
249 unsigned int unp_offset;
250 unsigned int unp_buffer_size;
251 unsigned char *unp_buffer;
252 unsigned int dictionary_size;
253 char start_new_block;
255 unsigned long crc_calculated;
256 int found_first_header;
257 char has_endarc_header;
258 struct data_block_offsets *dbo;
263 struct huffman_code maincode;
264 struct huffman_code offsetcode;
265 struct huffman_code lowoffsetcode;
266 struct huffman_code lengthcode;
267 unsigned char lengthtable[HUFFMAN_TABLE_SIZE];
269 char output_last_match;
270 unsigned int lastlength;
271 unsigned int lastoffset;
272 unsigned int oldoffset[4];
273 unsigned int lastlowoffset;
274 unsigned int numlowoffsetrepeats;
276 char start_new_table;
278 /* PPMd Variant H members */
283 CPpmd7 ppmd7_context;
284 CPpmd7z_RangeDec range_dec;
288 * String conversion object.
290 int init_default_conversion;
291 struct archive_string_conv *sconv_default;
292 struct archive_string_conv *opt_sconv;
293 struct archive_string_conv *sconv_utf8;
294 struct archive_string_conv *sconv_utf16be;
300 #define CACHE_TYPE uint64_t
301 #define CACHE_BITS (8 * sizeof(CACHE_TYPE))
303 CACHE_TYPE cache_buffer;
304 /* Indicates how many bits avail in cache_buffer. */
307 const unsigned char *next_in;
311 * Custom field to denote that this archive contains encrypted entries
313 int has_encrypted_entries;
316 static int archive_read_support_format_rar_capabilities(struct archive_read *);
317 static int archive_read_format_rar_has_encrypted_entries(struct archive_read *);
318 static int archive_read_format_rar_bid(struct archive_read *, int);
319 static int archive_read_format_rar_options(struct archive_read *,
320 const char *, const char *);
321 static int archive_read_format_rar_read_header(struct archive_read *,
322 struct archive_entry *);
323 static int archive_read_format_rar_read_data(struct archive_read *,
324 const void **, size_t *, int64_t *);
325 static int archive_read_format_rar_read_data_skip(struct archive_read *a);
326 static int64_t archive_read_format_rar_seek_data(struct archive_read *, int64_t,
328 static int archive_read_format_rar_cleanup(struct archive_read *);
330 /* Support functions */
331 static int read_header(struct archive_read *, struct archive_entry *, char);
332 static time_t get_time(int);
333 static int read_exttime(const char *, struct rar *, const char *);
334 static int read_symlink_stored(struct archive_read *, struct archive_entry *,
335 struct archive_string_conv *);
336 static int read_data_stored(struct archive_read *, const void **, size_t *,
338 static int read_data_compressed(struct archive_read *, const void **, size_t *,
340 static int rar_br_preparation(struct archive_read *, struct rar_br *);
341 static int parse_codes(struct archive_read *);
342 static void free_codes(struct archive_read *);
343 static int read_next_symbol(struct archive_read *, struct huffman_code *);
344 static int create_code(struct archive_read *, struct huffman_code *,
345 unsigned char *, int, char);
346 static int add_value(struct archive_read *, struct huffman_code *, int, int,
348 static int new_node(struct huffman_code *);
349 static int make_table(struct archive_read *, struct huffman_code *);
350 static int make_table_recurse(struct archive_read *, struct huffman_code *, int,
351 struct huffman_table_entry *, int, int);
352 static int64_t expand(struct archive_read *, int64_t);
353 static int copy_from_lzss_window(struct archive_read *, const void **,
355 static const void *rar_read_ahead(struct archive_read *, size_t, ssize_t *);
360 /* Check that the cache buffer has enough bits. */
361 #define rar_br_has(br, n) ((br)->cache_avail >= n)
362 /* Get compressed data by bit. */
363 #define rar_br_bits(br, n) \
364 (((uint32_t)((br)->cache_buffer >> \
365 ((br)->cache_avail - (n)))) & cache_masks[n])
366 #define rar_br_bits_forced(br, n) \
367 (((uint32_t)((br)->cache_buffer << \
368 ((n) - (br)->cache_avail))) & cache_masks[n])
369 /* Read ahead to make sure the cache buffer has enough compressed data we
371 * True : completed, there is enough data in the cache buffer.
372 * False : there is no data in the stream. */
373 #define rar_br_read_ahead(a, br, n) \
374 ((rar_br_has(br, (n)) || rar_br_fillup(a, br)) || rar_br_has(br, (n)))
375 /* Notify how many bits we consumed. */
376 #define rar_br_consume(br, n) ((br)->cache_avail -= (n))
377 #define rar_br_consume_unalined_bits(br) ((br)->cache_avail &= ~7)
379 static const uint32_t cache_masks[] = {
380 0x00000000, 0x00000001, 0x00000003, 0x00000007,
381 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F,
382 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
383 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
384 0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF,
385 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
386 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF,
387 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
388 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
392 * Shift away used bits in the cache data and fill it up with following bits.
393 * Call this when cache buffer does not have enough bits you need.
395 * Returns 1 if the cache buffer is full.
396 * Returns 0 if the cache buffer is not full; input buffer is empty.
399 rar_br_fillup(struct archive_read *a, struct rar_br *br)
401 struct rar *rar = (struct rar *)(a->format->data);
402 int n = CACHE_BITS - br->cache_avail;
407 if (br->avail_in >= 8) {
409 ((uint64_t)br->next_in[0]) << 56 |
410 ((uint64_t)br->next_in[1]) << 48 |
411 ((uint64_t)br->next_in[2]) << 40 |
412 ((uint64_t)br->next_in[3]) << 32 |
413 ((uint32_t)br->next_in[4]) << 24 |
414 ((uint32_t)br->next_in[5]) << 16 |
415 ((uint32_t)br->next_in[6]) << 8 |
416 (uint32_t)br->next_in[7];
419 br->cache_avail += 8 * 8;
420 rar->bytes_unconsumed += 8;
421 rar->bytes_remaining -= 8;
426 if (br->avail_in >= 7) {
428 (br->cache_buffer << 56) |
429 ((uint64_t)br->next_in[0]) << 48 |
430 ((uint64_t)br->next_in[1]) << 40 |
431 ((uint64_t)br->next_in[2]) << 32 |
432 ((uint32_t)br->next_in[3]) << 24 |
433 ((uint32_t)br->next_in[4]) << 16 |
434 ((uint32_t)br->next_in[5]) << 8 |
435 (uint32_t)br->next_in[6];
438 br->cache_avail += 7 * 8;
439 rar->bytes_unconsumed += 7;
440 rar->bytes_remaining -= 7;
445 if (br->avail_in >= 6) {
447 (br->cache_buffer << 48) |
448 ((uint64_t)br->next_in[0]) << 40 |
449 ((uint64_t)br->next_in[1]) << 32 |
450 ((uint32_t)br->next_in[2]) << 24 |
451 ((uint32_t)br->next_in[3]) << 16 |
452 ((uint32_t)br->next_in[4]) << 8 |
453 (uint32_t)br->next_in[5];
456 br->cache_avail += 6 * 8;
457 rar->bytes_unconsumed += 6;
458 rar->bytes_remaining -= 6;
463 /* We have enough compressed data in
464 * the cache buffer.*/
469 if (br->avail_in <= 0) {
471 if (rar->bytes_unconsumed > 0) {
472 /* Consume as much as the decompressor
474 __archive_read_consume(a, rar->bytes_unconsumed);
475 rar->bytes_unconsumed = 0;
477 br->next_in = rar_read_ahead(a, 1, &(br->avail_in));
478 if (br->next_in == NULL)
480 if (br->avail_in == 0)
484 (br->cache_buffer << 8) | *br->next_in++;
486 br->cache_avail += 8;
488 rar->bytes_unconsumed++;
489 rar->bytes_remaining--;
494 rar_br_preparation(struct archive_read *a, struct rar_br *br)
496 struct rar *rar = (struct rar *)(a->format->data);
498 if (rar->bytes_remaining > 0) {
499 br->next_in = rar_read_ahead(a, 1, &(br->avail_in));
500 if (br->next_in == NULL) {
501 archive_set_error(&a->archive,
502 ARCHIVE_ERRNO_FILE_FORMAT,
503 "Truncated RAR file data");
504 return (ARCHIVE_FATAL);
506 if (br->cache_avail == 0)
507 (void)rar_br_fillup(a, br);
512 /* Find last bit set */
514 rar_fls(unsigned int word)
520 word |= (word >> 16);
521 return word - (word >> 1);
525 static inline int64_t
526 lzss_position(struct lzss *lzss)
528 return lzss->position;
532 lzss_mask(struct lzss *lzss)
538 lzss_size(struct lzss *lzss)
540 return lzss->mask + 1;
544 lzss_offset_for_position(struct lzss *lzss, int64_t pos)
546 return (int)(pos & lzss->mask);
549 static inline unsigned char *
550 lzss_pointer_for_position(struct lzss *lzss, int64_t pos)
552 return &lzss->window[lzss_offset_for_position(lzss, pos)];
556 lzss_current_offset(struct lzss *lzss)
558 return lzss_offset_for_position(lzss, lzss->position);
561 static inline uint8_t *
562 lzss_current_pointer(struct lzss *lzss)
564 return lzss_pointer_for_position(lzss, lzss->position);
568 lzss_emit_literal(struct rar *rar, uint8_t literal)
570 *lzss_current_pointer(&rar->lzss) = literal;
571 rar->lzss.position++;
575 lzss_emit_match(struct rar *rar, int offset, int length)
577 int dstoffs = lzss_current_offset(&rar->lzss);
578 int srcoffs = (dstoffs - offset) & lzss_mask(&rar->lzss);
579 int l, li, remaining;
580 unsigned char *d, *s;
583 while (remaining > 0) {
585 if (dstoffs > srcoffs) {
586 if (l > lzss_size(&rar->lzss) - dstoffs)
587 l = lzss_size(&rar->lzss) - dstoffs;
589 if (l > lzss_size(&rar->lzss) - srcoffs)
590 l = lzss_size(&rar->lzss) - srcoffs;
592 d = &(rar->lzss.window[dstoffs]);
593 s = &(rar->lzss.window[srcoffs]);
594 if ((dstoffs + l < srcoffs) || (srcoffs + l < dstoffs))
597 for (li = 0; li < l; li++)
601 dstoffs = (dstoffs + l) & lzss_mask(&(rar->lzss));
602 srcoffs = (srcoffs + l) & lzss_mask(&(rar->lzss));
604 rar->lzss.position += length;
608 ppmd_alloc(void *p, size_t size)
614 ppmd_free(void *p, void *address)
619 static ISzAlloc g_szalloc = { ppmd_alloc, ppmd_free };
624 struct archive_read *a = ((IByteIn*)p)->a;
625 struct rar *rar = (struct rar *)(a->format->data);
626 struct rar_br *br = &(rar->br);
628 if (!rar_br_read_ahead(a, br, 8))
630 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
631 "Truncated RAR file data");
635 b = rar_br_bits(br, 8);
636 rar_br_consume(br, 8);
641 archive_read_support_format_rar(struct archive *_a)
643 struct archive_read *a = (struct archive_read *)_a;
647 archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
648 "archive_read_support_format_rar");
650 rar = (struct rar *)malloc(sizeof(*rar));
653 archive_set_error(&a->archive, ENOMEM, "Can't allocate rar data");
654 return (ARCHIVE_FATAL);
656 memset(rar, 0, sizeof(*rar));
659 * Until enough data has been read, we cannot tell about
660 * any encrypted entries yet.
662 rar->has_encrypted_entries = ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW;
664 r = __archive_read_register_format(a,
667 archive_read_format_rar_bid,
668 archive_read_format_rar_options,
669 archive_read_format_rar_read_header,
670 archive_read_format_rar_read_data,
671 archive_read_format_rar_read_data_skip,
672 archive_read_format_rar_seek_data,
673 archive_read_format_rar_cleanup,
674 archive_read_support_format_rar_capabilities,
675 archive_read_format_rar_has_encrypted_entries);
683 archive_read_support_format_rar_capabilities(struct archive_read * a)
685 (void)a; /* UNUSED */
686 return (ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_DATA
687 | ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_METADATA);
691 archive_read_format_rar_has_encrypted_entries(struct archive_read *_a)
693 if (_a && _a->format) {
694 struct rar * rar = (struct rar *)_a->format->data;
696 return rar->has_encrypted_entries;
699 return ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW;
704 archive_read_format_rar_bid(struct archive_read *a, int best_bid)
708 /* If there's already a bid > 30, we'll never win. */
712 if ((p = __archive_read_ahead(a, 7, NULL)) == NULL)
715 if (memcmp(p, RAR_SIGNATURE, 7) == 0)
718 if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) {
719 /* This is a PE file */
720 ssize_t offset = 0x10000;
721 ssize_t window = 4096;
723 while (offset + window <= (1024 * 128)) {
724 const char *buff = __archive_read_ahead(a, offset + window, &bytes_avail);
726 /* Remaining bytes are less than window. */
733 while (p + 7 < buff + bytes_avail) {
734 if (memcmp(p, RAR_SIGNATURE, 7) == 0)
745 skip_sfx(struct archive_read *a)
750 ssize_t bytes, window;
754 while (total + window <= (1024 * 128)) {
755 h = __archive_read_ahead(a, window, &bytes);
757 /* Remaining bytes are less than window. */
769 * Scan ahead until we find something that looks
770 * like the RAR header.
773 if (memcmp(p, RAR_SIGNATURE, 7) == 0) {
774 skip = p - (const char *)h;
775 __archive_read_consume(a, skip);
780 skip = p - (const char *)h;
781 __archive_read_consume(a, skip);
785 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
786 "Couldn't find out RAR header");
787 return (ARCHIVE_FATAL);
791 archive_read_format_rar_options(struct archive_read *a,
792 const char *key, const char *val)
795 int ret = ARCHIVE_FAILED;
797 rar = (struct rar *)(a->format->data);
798 if (strcmp(key, "hdrcharset") == 0) {
799 if (val == NULL || val[0] == 0)
800 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
801 "rar: hdrcharset option needs a character-set name");
804 archive_string_conversion_from_charset(
805 &a->archive, val, 0);
806 if (rar->opt_sconv != NULL)
814 /* Note: The "warn" return is just to inform the options
815 * supervisor that we didn't handle it. It will generate
816 * a suitable error if no one used this option. */
817 return (ARCHIVE_WARN);
821 archive_read_format_rar_read_header(struct archive_read *a,
822 struct archive_entry *entry)
831 unsigned long crc32_expected;
833 a->archive.archive_format = ARCHIVE_FORMAT_RAR;
834 if (a->archive.archive_format_name == NULL)
835 a->archive.archive_format_name = "RAR";
837 rar = (struct rar *)(a->format->data);
840 * It should be sufficient to call archive_read_next_header() for
841 * a reader to determine if an entry is encrypted or not. If the
842 * encryption of an entry is only detectable when calling
843 * archive_read_data(), so be it. We'll do the same check there
846 if (rar->has_encrypted_entries == ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW) {
847 rar->has_encrypted_entries = 0;
850 /* RAR files can be generated without EOF headers, so return ARCHIVE_EOF if
853 if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
854 return (ARCHIVE_EOF);
857 if (rar->found_first_header == 0 &&
858 ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0)) {
859 /* This is an executable ? Must be self-extracting... */
861 if (ret < ARCHIVE_WARN)
864 rar->found_first_header = 1;
868 unsigned long crc32_val;
870 if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
871 return (ARCHIVE_FATAL);
878 if (memcmp(p, RAR_SIGNATURE, 7) != 0) {
879 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
880 "Invalid marker header");
881 return (ARCHIVE_FATAL);
883 __archive_read_consume(a, 7);
887 rar->main_flags = archive_le16dec(p + 3);
888 skip = archive_le16dec(p + 5);
889 if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)) {
890 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
891 "Invalid header size");
892 return (ARCHIVE_FATAL);
894 if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
895 return (ARCHIVE_FATAL);
897 memcpy(rar->reserved1, p + 7, sizeof(rar->reserved1));
898 memcpy(rar->reserved2, p + 7 + sizeof(rar->reserved1),
899 sizeof(rar->reserved2));
900 if (rar->main_flags & MHD_ENCRYPTVER) {
901 if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)+1) {
902 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
903 "Invalid header size");
904 return (ARCHIVE_FATAL);
906 rar->encryptver = *(p + 7 + sizeof(rar->reserved1) +
907 sizeof(rar->reserved2));
910 /* Main header is password encrytped, so we cannot read any
911 file names or any other info about files from the header. */
912 if (rar->main_flags & MHD_PASSWORD)
914 archive_entry_set_is_metadata_encrypted(entry, 1);
915 archive_entry_set_is_data_encrypted(entry, 1);
916 rar->has_encrypted_entries = 1;
917 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
918 "RAR encryption support unavailable.");
919 return (ARCHIVE_FATAL);
922 crc32_val = crc32(0, (const unsigned char *)p + 2, (unsigned)skip - 2);
923 if ((crc32_val & 0xffff) != archive_le16dec(p)) {
924 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
926 return (ARCHIVE_FATAL);
928 __archive_read_consume(a, skip);
932 return read_header(a, entry, head_type);
940 flags = archive_le16dec(p + 3);
941 skip = archive_le16dec(p + 5);
943 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
944 "Invalid header size too small");
945 return (ARCHIVE_FATAL);
947 if (flags & HD_ADD_SIZE_PRESENT)
950 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
951 "Invalid header size too small");
952 return (ARCHIVE_FATAL);
954 if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
955 return (ARCHIVE_FATAL);
957 skip += archive_le32dec(p + 7);
960 /* Skip over the 2-byte CRC at the beginning of the header. */
961 crc32_expected = archive_le16dec(p);
962 __archive_read_consume(a, 2);
965 /* Skim the entire header and compute the CRC. */
968 size_t to_read = skip;
970 if (to_read > 32 * 1024) {
973 if ((h = __archive_read_ahead(a, to_read, &did_read)) == NULL) {
974 return (ARCHIVE_FATAL);
977 crc32_val = crc32(crc32_val, (const unsigned char *)p, (unsigned)did_read);
978 __archive_read_consume(a, did_read);
981 if ((crc32_val & 0xffff) != crc32_expected) {
982 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
984 return (ARCHIVE_FATAL);
986 if (head_type == ENDARC_HEAD)
987 return (ARCHIVE_EOF);
991 if ((ret = read_header(a, entry, head_type)) < ARCHIVE_WARN)
996 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
998 return (ARCHIVE_FATAL);
1004 archive_read_format_rar_read_data(struct archive_read *a, const void **buff,
1005 size_t *size, int64_t *offset)
1007 struct rar *rar = (struct rar *)(a->format->data);
1010 if (rar->has_encrypted_entries == ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW) {
1011 rar->has_encrypted_entries = 0;
1014 if (rar->bytes_unconsumed > 0) {
1015 /* Consume as much as the decompressor actually used. */
1016 __archive_read_consume(a, rar->bytes_unconsumed);
1017 rar->bytes_unconsumed = 0;
1021 if (rar->entry_eof || rar->offset_seek >= rar->unp_size) {
1023 *offset = rar->offset;
1024 if (*offset < rar->unp_size)
1025 *offset = rar->unp_size;
1026 return (ARCHIVE_EOF);
1029 switch (rar->compression_method)
1031 case COMPRESS_METHOD_STORE:
1032 ret = read_data_stored(a, buff, size, offset);
1035 case COMPRESS_METHOD_FASTEST:
1036 case COMPRESS_METHOD_FAST:
1037 case COMPRESS_METHOD_NORMAL:
1038 case COMPRESS_METHOD_GOOD:
1039 case COMPRESS_METHOD_BEST:
1040 ret = read_data_compressed(a, buff, size, offset);
1041 if (ret != ARCHIVE_OK && ret != ARCHIVE_WARN)
1042 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
1046 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1047 "Unsupported compression method for RAR file.");
1048 ret = ARCHIVE_FATAL;
1055 archive_read_format_rar_read_data_skip(struct archive_read *a)
1058 int64_t bytes_skipped;
1061 rar = (struct rar *)(a->format->data);
1063 if (rar->bytes_unconsumed > 0) {
1064 /* Consume as much as the decompressor actually used. */
1065 __archive_read_consume(a, rar->bytes_unconsumed);
1066 rar->bytes_unconsumed = 0;
1069 if (rar->bytes_remaining > 0) {
1070 bytes_skipped = __archive_read_consume(a, rar->bytes_remaining);
1071 if (bytes_skipped < 0)
1072 return (ARCHIVE_FATAL);
1075 /* Compressed data to skip must be read from each header in a multivolume
1078 if (rar->main_flags & MHD_VOLUME && rar->file_flags & FHD_SPLIT_AFTER)
1080 ret = archive_read_format_rar_read_header(a, a->entry);
1081 if (ret == (ARCHIVE_EOF))
1082 ret = archive_read_format_rar_read_header(a, a->entry);
1083 if (ret != (ARCHIVE_OK))
1085 return archive_read_format_rar_read_data_skip(a);
1088 return (ARCHIVE_OK);
1092 archive_read_format_rar_seek_data(struct archive_read *a, int64_t offset,
1095 int64_t client_offset, ret;
1097 struct rar *rar = (struct rar *)(a->format->data);
1099 if (rar->compression_method == COMPRESS_METHOD_STORE)
1101 /* Modify the offset for use with SEEK_SET */
1105 client_offset = rar->offset_seek;
1108 client_offset = rar->unp_size;
1114 client_offset += offset;
1115 if (client_offset < 0)
1117 /* Can't seek past beginning of data block */
1120 else if (client_offset > rar->unp_size)
1123 * Set the returned offset but only seek to the end of
1126 rar->offset_seek = client_offset;
1127 client_offset = rar->unp_size;
1130 client_offset += rar->dbo[0].start_offset;
1132 while (i < rar->cursor)
1135 client_offset += rar->dbo[i].start_offset - rar->dbo[i-1].end_offset;
1137 if (rar->main_flags & MHD_VOLUME)
1139 /* Find the appropriate offset among the multivolume archive */
1142 if (client_offset < rar->dbo[rar->cursor].start_offset &&
1143 rar->file_flags & FHD_SPLIT_BEFORE)
1145 /* Search backwards for the correct data block */
1146 if (rar->cursor == 0)
1148 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1149 "Attempt to seek past beginning of RAR data block");
1150 return (ARCHIVE_FAILED);
1153 client_offset -= rar->dbo[rar->cursor+1].start_offset -
1154 rar->dbo[rar->cursor].end_offset;
1155 if (client_offset < rar->dbo[rar->cursor].start_offset)
1157 ret = __archive_read_seek(a, rar->dbo[rar->cursor].start_offset -
1158 rar->dbo[rar->cursor].header_size, SEEK_SET);
1159 if (ret < (ARCHIVE_OK))
1161 ret = archive_read_format_rar_read_header(a, a->entry);
1162 if (ret != (ARCHIVE_OK))
1164 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1165 "Error during seek of RAR file");
1166 return (ARCHIVE_FAILED);
1171 else if (client_offset > rar->dbo[rar->cursor].end_offset &&
1172 rar->file_flags & FHD_SPLIT_AFTER)
1174 /* Search forward for the correct data block */
1176 if (rar->cursor < rar->nodes &&
1177 client_offset > rar->dbo[rar->cursor].end_offset)
1179 client_offset += rar->dbo[rar->cursor].start_offset -
1180 rar->dbo[rar->cursor-1].end_offset;
1184 ret = __archive_read_seek(a, rar->dbo[rar->cursor].end_offset,
1186 if (ret < (ARCHIVE_OK))
1188 ret = archive_read_format_rar_read_header(a, a->entry);
1189 if (ret == (ARCHIVE_EOF))
1191 rar->has_endarc_header = 1;
1192 ret = archive_read_format_rar_read_header(a, a->entry);
1194 if (ret != (ARCHIVE_OK))
1196 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1197 "Error during seek of RAR file");
1198 return (ARCHIVE_FAILED);
1200 client_offset += rar->dbo[rar->cursor].start_offset -
1201 rar->dbo[rar->cursor-1].end_offset;
1208 ret = __archive_read_seek(a, client_offset, SEEK_SET);
1209 if (ret < (ARCHIVE_OK))
1211 rar->bytes_remaining = rar->dbo[rar->cursor].end_offset - ret;
1216 ret -= rar->dbo[i+1].start_offset - rar->dbo[i].end_offset;
1218 ret -= rar->dbo[0].start_offset;
1220 /* Always restart reading the file after a seek */
1221 __archive_reset_read_data(&a->archive);
1223 rar->bytes_unconsumed = 0;
1227 * If a seek past the end of file was requested, return the requested
1230 if (ret == rar->unp_size && rar->offset_seek > rar->unp_size)
1231 return rar->offset_seek;
1233 /* Return the new offset */
1234 rar->offset_seek = ret;
1235 return rar->offset_seek;
1239 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1240 "Seeking of compressed RAR files is unsupported");
1242 return (ARCHIVE_FAILED);
1246 archive_read_format_rar_cleanup(struct archive_read *a)
1250 rar = (struct rar *)(a->format->data);
1252 free(rar->filename);
1253 free(rar->filename_save);
1255 free(rar->unp_buffer);
1256 free(rar->lzss.window);
1257 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
1259 (a->format->data) = NULL;
1260 return (ARCHIVE_OK);
1264 read_header(struct archive_read *a, struct archive_entry *entry,
1268 const char *p, *endp;
1270 struct rar_header rar_header;
1271 struct rar_file_header file_header;
1272 int64_t header_size;
1273 unsigned filename_size, end;
1276 char packed_size[8];
1279 struct archive_string_conv *sconv, *fn_sconv;
1280 unsigned long crc32_val;
1281 int ret = (ARCHIVE_OK), ret2;
1283 rar = (struct rar *)(a->format->data);
1285 /* Setup a string conversion object for non-rar-unicode filenames. */
1286 sconv = rar->opt_sconv;
1287 if (sconv == NULL) {
1288 if (!rar->init_default_conversion) {
1289 rar->sconv_default =
1290 archive_string_default_conversion_for_read(
1292 rar->init_default_conversion = 1;
1294 sconv = rar->sconv_default;
1298 if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
1299 return (ARCHIVE_FATAL);
1301 memcpy(&rar_header, p, sizeof(rar_header));
1302 rar->file_flags = archive_le16dec(rar_header.flags);
1303 header_size = archive_le16dec(rar_header.size);
1304 if (header_size < (int64_t)sizeof(file_header) + 7) {
1305 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1306 "Invalid header size");
1307 return (ARCHIVE_FATAL);
1309 crc32_val = crc32(0, (const unsigned char *)p + 2, 7 - 2);
1310 __archive_read_consume(a, 7);
1312 if (!(rar->file_flags & FHD_SOLID))
1314 rar->compression_method = 0;
1315 rar->packed_size = 0;
1322 memset(&rar->salt, 0, sizeof(rar->salt));
1334 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1335 "RAR solid archive support unavailable.");
1336 return (ARCHIVE_FATAL);
1339 if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL)
1340 return (ARCHIVE_FATAL);
1342 /* File Header CRC check. */
1343 crc32_val = crc32(crc32_val, h, (unsigned)(header_size - 7));
1344 if ((crc32_val & 0xffff) != archive_le16dec(rar_header.crc)) {
1345 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1346 "Header CRC error");
1347 return (ARCHIVE_FATAL);
1349 /* If no CRC error, Go on parsing File Header. */
1351 endp = p + header_size - 7;
1352 memcpy(&file_header, p, sizeof(file_header));
1353 p += sizeof(file_header);
1355 rar->compression_method = file_header.method;
1357 ttime = archive_le32dec(file_header.file_time);
1358 rar->mtime = get_time(ttime);
1360 rar->file_crc = archive_le32dec(file_header.file_crc);
1362 if (rar->file_flags & FHD_PASSWORD)
1364 archive_entry_set_is_data_encrypted(entry, 1);
1365 rar->has_encrypted_entries = 1;
1366 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1367 "RAR encryption support unavailable.");
1368 /* Since it is only the data part itself that is encrypted we can at least
1369 extract information about the currently processed entry and don't need
1370 to return ARCHIVE_FATAL here. */
1371 /*return (ARCHIVE_FATAL);*/
1374 if (rar->file_flags & FHD_LARGE)
1376 memcpy(packed_size, file_header.pack_size, 4);
1377 memcpy(packed_size + 4, p, 4); /* High pack size */
1379 memcpy(unp_size, file_header.unp_size, 4);
1380 memcpy(unp_size + 4, p, 4); /* High unpack size */
1382 rar->packed_size = archive_le64dec(&packed_size);
1383 rar->unp_size = archive_le64dec(&unp_size);
1387 rar->packed_size = archive_le32dec(file_header.pack_size);
1388 rar->unp_size = archive_le32dec(file_header.unp_size);
1391 if (rar->packed_size < 0 || rar->unp_size < 0)
1393 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1394 "Invalid sizes specified.");
1395 return (ARCHIVE_FATAL);
1398 rar->bytes_remaining = rar->packed_size;
1400 /* TODO: RARv3 subblocks contain comments. For now the complete block is
1401 * consumed at the end.
1403 if (head_type == NEWSUB_HEAD) {
1404 size_t distance = p - (const char *)h;
1405 header_size += rar->packed_size;
1406 /* Make sure we have the extended data. */
1407 if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL)
1408 return (ARCHIVE_FATAL);
1410 endp = p + header_size - 7;
1414 filename_size = archive_le16dec(file_header.name_size);
1415 if (p + filename_size > endp) {
1416 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1417 "Invalid filename size");
1418 return (ARCHIVE_FATAL);
1420 if (rar->filename_allocated < filename_size * 2 + 2) {
1422 size_t newsize = filename_size * 2 + 2;
1423 newptr = realloc(rar->filename, newsize);
1424 if (newptr == NULL) {
1425 archive_set_error(&a->archive, ENOMEM,
1426 "Couldn't allocate memory.");
1427 return (ARCHIVE_FATAL);
1429 rar->filename = newptr;
1430 rar->filename_allocated = newsize;
1432 filename = rar->filename;
1433 memcpy(filename, p, filename_size);
1434 filename[filename_size] = '\0';
1435 if (rar->file_flags & FHD_UNICODE)
1437 if (filename_size != strlen(filename))
1439 unsigned char highbyte, flagbits, flagbyte;
1440 unsigned fn_end, offset;
1442 end = filename_size;
1443 fn_end = filename_size * 2;
1445 offset = (unsigned)strlen(filename) + 1;
1446 highbyte = *(p + offset++);
1449 while (offset < end && filename_size < fn_end)
1453 flagbyte = *(p + offset++);
1458 switch((flagbyte >> flagbits) & 3)
1461 filename[filename_size++] = '\0';
1462 filename[filename_size++] = *(p + offset++);
1465 filename[filename_size++] = highbyte;
1466 filename[filename_size++] = *(p + offset++);
1469 filename[filename_size++] = *(p + offset + 1);
1470 filename[filename_size++] = *(p + offset);
1476 uint8_t length = *(p + offset++);
1478 if (length & 0x80) {
1479 extra = *(p + offset++);
1480 high = (char)highbyte;
1483 length = (length & 0x7f) + 2;
1484 while (length && filename_size < fn_end) {
1485 unsigned cp = filename_size >> 1;
1486 filename[filename_size++] = high;
1487 filename[filename_size++] = p[cp] + extra;
1494 if (filename_size > fn_end) {
1495 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1496 "Invalid filename");
1497 return (ARCHIVE_FATAL);
1499 filename[filename_size++] = '\0';
1500 filename[filename_size++] = '\0';
1502 /* Decoded unicode form is UTF-16BE, so we have to update a string
1503 * conversion object for it. */
1504 if (rar->sconv_utf16be == NULL) {
1505 rar->sconv_utf16be = archive_string_conversion_from_charset(
1506 &a->archive, "UTF-16BE", 1);
1507 if (rar->sconv_utf16be == NULL)
1508 return (ARCHIVE_FATAL);
1510 fn_sconv = rar->sconv_utf16be;
1513 while (memcmp(strp, "\x00\x00", 2))
1515 if (!memcmp(strp, "\x00\\", 2))
1522 * If FHD_UNICODE is set but no unicode data, this file name form
1523 * is UTF-8, so we have to update a string conversion object for
1526 if (rar->sconv_utf8 == NULL) {
1527 rar->sconv_utf8 = archive_string_conversion_from_charset(
1528 &a->archive, "UTF-8", 1);
1529 if (rar->sconv_utf8 == NULL)
1530 return (ARCHIVE_FATAL);
1532 fn_sconv = rar->sconv_utf8;
1533 while ((strp = strchr(filename, '\\')) != NULL)
1541 while ((strp = strchr(filename, '\\')) != NULL)
1546 /* Split file in multivolume RAR. No more need to process header. */
1547 if (rar->filename_save &&
1548 filename_size == rar->filename_save_size &&
1549 !memcmp(rar->filename, rar->filename_save, filename_size + 1))
1551 __archive_read_consume(a, header_size - 7);
1553 if (rar->cursor >= rar->nodes)
1557 realloc(rar->dbo, sizeof(*rar->dbo) * rar->nodes)) == NULL)
1559 archive_set_error(&a->archive, ENOMEM, "Couldn't allocate memory.");
1560 return (ARCHIVE_FATAL);
1562 rar->dbo[rar->cursor].header_size = header_size;
1563 rar->dbo[rar->cursor].start_offset = -1;
1564 rar->dbo[rar->cursor].end_offset = -1;
1566 if (rar->dbo[rar->cursor].start_offset < 0)
1568 rar->dbo[rar->cursor].start_offset = a->filter->position;
1569 rar->dbo[rar->cursor].end_offset = rar->dbo[rar->cursor].start_offset +
1575 rar->filename_save = (char*)realloc(rar->filename_save,
1577 memcpy(rar->filename_save, rar->filename, filename_size + 1);
1578 rar->filename_save_size = filename_size;
1580 /* Set info for seeking */
1582 if ((rar->dbo = calloc(1, sizeof(*rar->dbo))) == NULL)
1584 archive_set_error(&a->archive, ENOMEM, "Couldn't allocate memory.");
1585 return (ARCHIVE_FATAL);
1587 rar->dbo[0].header_size = header_size;
1588 rar->dbo[0].start_offset = -1;
1589 rar->dbo[0].end_offset = -1;
1593 if (rar->file_flags & FHD_SALT)
1596 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1597 "Invalid header size");
1598 return (ARCHIVE_FATAL);
1600 memcpy(rar->salt, p, 8);
1604 if (rar->file_flags & FHD_EXTTIME) {
1605 if (read_exttime(p, rar, endp) < 0) {
1606 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1607 "Invalid header size");
1608 return (ARCHIVE_FATAL);
1612 __archive_read_consume(a, header_size - 7);
1613 rar->dbo[0].start_offset = a->filter->position;
1614 rar->dbo[0].end_offset = rar->dbo[0].start_offset + rar->packed_size;
1616 switch(file_header.host_os)
1621 rar->mode = archive_le32dec(file_header.file_attr);
1622 if (rar->mode & FILE_ATTRIBUTE_DIRECTORY)
1623 rar->mode = AE_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
1625 rar->mode = AE_IFREG;
1626 rar->mode |= S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
1632 rar->mode = archive_le32dec(file_header.file_attr);
1636 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1637 "Unknown file attributes from RAR file's host OS");
1638 return (ARCHIVE_FATAL);
1641 rar->bytes_uncopied = rar->bytes_unconsumed = 0;
1642 rar->lzss.position = rar->offset = 0;
1643 rar->offset_seek = 0;
1644 rar->dictionary_size = 0;
1645 rar->offset_outgoing = 0;
1646 rar->br.cache_avail = 0;
1647 rar->br.avail_in = 0;
1648 rar->crc_calculated = 0;
1651 rar->is_ppmd_block = 0;
1652 rar->start_new_table = 1;
1653 free(rar->unp_buffer);
1654 rar->unp_buffer = NULL;
1655 rar->unp_offset = 0;
1656 rar->unp_buffer_size = UNP_BUFFER_SIZE;
1657 memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
1658 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
1659 rar->ppmd_valid = rar->ppmd_eod = 0;
1661 /* Don't set any archive entries for non-file header types */
1662 if (head_type == NEWSUB_HEAD)
1665 archive_entry_set_mtime(entry, rar->mtime, rar->mnsec);
1666 archive_entry_set_ctime(entry, rar->ctime, rar->cnsec);
1667 archive_entry_set_atime(entry, rar->atime, rar->ansec);
1668 archive_entry_set_size(entry, rar->unp_size);
1669 archive_entry_set_mode(entry, rar->mode);
1671 if (archive_entry_copy_pathname_l(entry, filename, filename_size, fn_sconv))
1673 if (errno == ENOMEM)
1675 archive_set_error(&a->archive, ENOMEM,
1676 "Can't allocate memory for Pathname");
1677 return (ARCHIVE_FATAL);
1679 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1680 "Pathname cannot be converted from %s to current locale.",
1681 archive_string_conversion_charset_name(fn_sconv));
1682 ret = (ARCHIVE_WARN);
1685 if (((rar->mode) & AE_IFMT) == AE_IFLNK)
1687 /* Make sure a symbolic-link file does not have its body. */
1688 rar->bytes_remaining = 0;
1689 archive_entry_set_size(entry, 0);
1691 /* Read a symbolic-link name. */
1692 if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN))
1698 if (rar->bytes_remaining == 0)
1708 tm.tm_sec = 2 * (ttime & 0x1f);
1709 tm.tm_min = (ttime >> 5) & 0x3f;
1710 tm.tm_hour = (ttime >> 11) & 0x1f;
1711 tm.tm_mday = (ttime >> 16) & 0x1f;
1712 tm.tm_mon = ((ttime >> 21) & 0x0f) - 1;
1713 tm.tm_year = ((ttime >> 25) & 0x7f) + 80;
1719 read_exttime(const char *p, struct rar *rar, const char *endp)
1721 unsigned rmode, flags, rem, j, count;
1729 flags = archive_le16dec(p);
1732 for (i = 3; i >= 0; i--)
1737 rmode = flags >> i * 4;
1744 ttime = archive_le32dec(p);
1745 t = get_time(ttime);
1750 if (p + count > endp)
1752 for (j = 0; j < count; j++)
1754 rem = ((*p) << 16) | (rem >> 8);
1758 nsec = tm->tm_sec + rem / NS_UNIT;
1782 rar->arcnsec = nsec;
1790 read_symlink_stored(struct archive_read *a, struct archive_entry *entry,
1791 struct archive_string_conv *sconv)
1796 int ret = (ARCHIVE_OK);
1798 rar = (struct rar *)(a->format->data);
1799 if ((h = rar_read_ahead(a, (size_t)rar->packed_size, NULL)) == NULL)
1800 return (ARCHIVE_FATAL);
1803 if (archive_entry_copy_symlink_l(entry,
1804 p, (size_t)rar->packed_size, sconv))
1806 if (errno == ENOMEM)
1808 archive_set_error(&a->archive, ENOMEM,
1809 "Can't allocate memory for link");
1810 return (ARCHIVE_FATAL);
1812 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1813 "link cannot be converted from %s to current locale.",
1814 archive_string_conversion_charset_name(sconv));
1815 ret = (ARCHIVE_WARN);
1817 __archive_read_consume(a, rar->packed_size);
1822 read_data_stored(struct archive_read *a, const void **buff, size_t *size,
1826 ssize_t bytes_avail;
1828 rar = (struct rar *)(a->format->data);
1829 if (rar->bytes_remaining == 0 &&
1830 !(rar->main_flags & MHD_VOLUME && rar->file_flags & FHD_SPLIT_AFTER))
1834 *offset = rar->offset;
1835 if (rar->file_crc != rar->crc_calculated) {
1836 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1838 return (ARCHIVE_FATAL);
1841 return (ARCHIVE_EOF);
1844 *buff = rar_read_ahead(a, 1, &bytes_avail);
1845 if (bytes_avail <= 0)
1847 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1848 "Truncated RAR file data");
1849 return (ARCHIVE_FATAL);
1852 *size = bytes_avail;
1853 *offset = rar->offset;
1854 rar->offset += bytes_avail;
1855 rar->offset_seek += bytes_avail;
1856 rar->bytes_remaining -= bytes_avail;
1857 rar->bytes_unconsumed = bytes_avail;
1858 /* Calculate File CRC. */
1859 rar->crc_calculated = crc32(rar->crc_calculated, *buff,
1860 (unsigned)bytes_avail);
1861 return (ARCHIVE_OK);
1865 read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
1869 int64_t start, end, actualend;
1871 int ret = (ARCHIVE_OK), sym, code, lzss_offset, length, i;
1873 rar = (struct rar *)(a->format->data);
1877 return (ARCHIVE_FATAL);
1878 if (rar->ppmd_eod ||
1879 (rar->dictionary_size && rar->offset >= rar->unp_size))
1881 if (rar->unp_offset > 0) {
1883 * We have unprocessed extracted data. write it out.
1885 *buff = rar->unp_buffer;
1886 *size = rar->unp_offset;
1887 *offset = rar->offset_outgoing;
1888 rar->offset_outgoing += *size;
1889 /* Calculate File CRC. */
1890 rar->crc_calculated = crc32(rar->crc_calculated, *buff,
1892 rar->unp_offset = 0;
1893 return (ARCHIVE_OK);
1897 *offset = rar->offset;
1898 if (rar->file_crc != rar->crc_calculated) {
1899 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1901 return (ARCHIVE_FATAL);
1904 return (ARCHIVE_EOF);
1907 if (!rar->is_ppmd_block && rar->dictionary_size && rar->bytes_uncopied > 0)
1909 if (rar->bytes_uncopied > (rar->unp_buffer_size - rar->unp_offset))
1910 bs = rar->unp_buffer_size - rar->unp_offset;
1912 bs = (size_t)rar->bytes_uncopied;
1913 ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs);
1914 if (ret != ARCHIVE_OK)
1917 rar->bytes_uncopied -= bs;
1918 if (*buff != NULL) {
1919 rar->unp_offset = 0;
1920 *size = rar->unp_buffer_size;
1921 *offset = rar->offset_outgoing;
1922 rar->offset_outgoing += *size;
1923 /* Calculate File CRC. */
1924 rar->crc_calculated = crc32(rar->crc_calculated, *buff,
1931 if (!rar->br.next_in &&
1932 (ret = rar_br_preparation(a, &(rar->br))) < ARCHIVE_WARN)
1934 if (rar->start_new_table && ((ret = parse_codes(a)) < (ARCHIVE_WARN)))
1937 if (rar->is_ppmd_block)
1939 if ((sym = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1940 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1942 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1944 return (ARCHIVE_FATAL);
1946 if(sym != rar->ppmd_escape)
1948 lzss_emit_literal(rar, sym);
1949 rar->bytes_uncopied++;
1953 if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1954 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1956 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1958 return (ARCHIVE_FATAL);
1964 rar->start_new_table = 1;
1965 return read_data_compressed(a, buff, size, offset);
1968 rar->ppmd_eod = 1;/* End Of ppmd Data. */
1972 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1973 "Parsing filters is unsupported.");
1974 return (ARCHIVE_FAILED);
1978 for (i = 2; i >= 0; i--)
1980 if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1981 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1983 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1985 return (ARCHIVE_FATAL);
1987 lzss_offset |= code << (i * 8);
1989 if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1990 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1992 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1994 return (ARCHIVE_FATAL);
1996 lzss_emit_match(rar, lzss_offset + 2, length + 32);
1997 rar->bytes_uncopied += length + 32;
2001 if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
2002 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
2004 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2006 return (ARCHIVE_FATAL);
2008 lzss_emit_match(rar, 1, length + 4);
2009 rar->bytes_uncopied += length + 4;
2013 lzss_emit_literal(rar, sym);
2014 rar->bytes_uncopied++;
2020 start = rar->offset;
2021 end = start + rar->dictionary_size;
2022 rar->filterstart = INT64_MAX;
2024 if ((actualend = expand(a, end)) < 0)
2025 return ((int)actualend);
2027 rar->bytes_uncopied = actualend - start;
2028 if (rar->bytes_uncopied == 0) {
2029 /* Broken RAR files cause this case.
2030 * NOTE: If this case were possible on a normal RAR file
2031 * we would find out where it was actually bad and
2032 * what we would do to solve it. */
2033 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2034 "Internal error extracting RAR file");
2035 return (ARCHIVE_FATAL);
2038 if (rar->bytes_uncopied > (rar->unp_buffer_size - rar->unp_offset))
2039 bs = rar->unp_buffer_size - rar->unp_offset;
2041 bs = (size_t)rar->bytes_uncopied;
2042 ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs);
2043 if (ret != ARCHIVE_OK)
2046 rar->bytes_uncopied -= bs;
2048 * If *buff is NULL, it means unp_buffer is not full.
2049 * So we have to continue extracting a RAR file.
2051 } while (*buff == NULL);
2053 rar->unp_offset = 0;
2054 *size = rar->unp_buffer_size;
2055 *offset = rar->offset_outgoing;
2056 rar->offset_outgoing += *size;
2057 /* Calculate File CRC. */
2058 rar->crc_calculated = crc32(rar->crc_calculated, *buff, (unsigned)*size);
2063 parse_codes(struct archive_read *a)
2065 int i, j, val, n, r;
2066 unsigned char bitlengths[MAX_SYMBOLS], zerocount, ppmd_flags;
2067 unsigned int maxorder;
2068 struct huffman_code precode;
2069 struct rar *rar = (struct rar *)(a->format->data);
2070 struct rar_br *br = &(rar->br);
2074 /* Skip to the next byte */
2075 rar_br_consume_unalined_bits(br);
2077 /* PPMd block flag */
2078 if (!rar_br_read_ahead(a, br, 1))
2079 goto truncated_data;
2080 if ((rar->is_ppmd_block = rar_br_bits(br, 1)) != 0)
2082 rar_br_consume(br, 1);
2083 if (!rar_br_read_ahead(a, br, 7))
2084 goto truncated_data;
2085 ppmd_flags = rar_br_bits(br, 7);
2086 rar_br_consume(br, 7);
2088 /* Memory is allocated in MB */
2089 if (ppmd_flags & 0x20)
2091 if (!rar_br_read_ahead(a, br, 8))
2092 goto truncated_data;
2093 rar->dictionary_size = (rar_br_bits(br, 8) + 1) << 20;
2094 rar_br_consume(br, 8);
2097 if (ppmd_flags & 0x40)
2099 if (!rar_br_read_ahead(a, br, 8))
2100 goto truncated_data;
2101 rar->ppmd_escape = rar->ppmd7_context.InitEsc = rar_br_bits(br, 8);
2102 rar_br_consume(br, 8);
2105 rar->ppmd_escape = 2;
2107 if (ppmd_flags & 0x20)
2109 maxorder = (ppmd_flags & 0x1F) + 1;
2111 maxorder = 16 + (maxorder - 16) * 3;
2115 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2116 "Truncated RAR file data");
2117 return (ARCHIVE_FATAL);
2120 /* Make sure ppmd7_contest is freed before Ppmd7_Construct
2121 * because reading a broken file cause this abnormal sequence. */
2122 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context, &g_szalloc);
2125 rar->bytein.Read = &ppmd_read;
2126 __archive_ppmd7_functions.PpmdRAR_RangeDec_CreateVTable(&rar->range_dec);
2127 rar->range_dec.Stream = &rar->bytein;
2128 __archive_ppmd7_functions.Ppmd7_Construct(&rar->ppmd7_context);
2130 if (rar->dictionary_size == 0) {
2131 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2132 "Invalid zero dictionary size");
2133 return (ARCHIVE_FATAL);
2136 if (!__archive_ppmd7_functions.Ppmd7_Alloc(&rar->ppmd7_context,
2137 rar->dictionary_size, &g_szalloc))
2139 archive_set_error(&a->archive, ENOMEM,
2141 return (ARCHIVE_FATAL);
2143 if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
2145 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2146 "Unable to initialize PPMd range decoder");
2147 return (ARCHIVE_FATAL);
2149 __archive_ppmd7_functions.Ppmd7_Init(&rar->ppmd7_context, maxorder);
2150 rar->ppmd_valid = 1;
2154 if (!rar->ppmd_valid) {
2155 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2156 "Invalid PPMd sequence");
2157 return (ARCHIVE_FATAL);
2159 if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
2161 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2162 "Unable to initialize PPMd range decoder");
2163 return (ARCHIVE_FATAL);
2169 rar_br_consume(br, 1);
2171 /* Keep existing table flag */
2172 if (!rar_br_read_ahead(a, br, 1))
2173 goto truncated_data;
2174 if (!rar_br_bits(br, 1))
2175 memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
2176 rar_br_consume(br, 1);
2178 memset(&bitlengths, 0, sizeof(bitlengths));
2179 for (i = 0; i < MAX_SYMBOLS;)
2181 if (!rar_br_read_ahead(a, br, 4))
2182 goto truncated_data;
2183 bitlengths[i++] = rar_br_bits(br, 4);
2184 rar_br_consume(br, 4);
2185 if (bitlengths[i-1] == 0xF)
2187 if (!rar_br_read_ahead(a, br, 4))
2188 goto truncated_data;
2189 zerocount = rar_br_bits(br, 4);
2190 rar_br_consume(br, 4);
2194 for (j = 0; j < zerocount + 2 && i < MAX_SYMBOLS; j++)
2195 bitlengths[i++] = 0;
2200 memset(&precode, 0, sizeof(precode));
2201 r = create_code(a, &precode, bitlengths, MAX_SYMBOLS, MAX_SYMBOL_LENGTH);
2202 if (r != ARCHIVE_OK) {
2204 free(precode.table);
2208 for (i = 0; i < HUFFMAN_TABLE_SIZE;)
2210 if ((val = read_next_symbol(a, &precode)) < 0) {
2212 free(precode.table);
2213 return (ARCHIVE_FATAL);
2217 rar->lengthtable[i] = (rar->lengthtable[i] + val) & 0xF;
2225 free(precode.table);
2226 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2227 "Internal error extracting RAR file.");
2228 return (ARCHIVE_FATAL);
2232 if (!rar_br_read_ahead(a, br, 3)) {
2234 free(precode.table);
2235 goto truncated_data;
2237 n = rar_br_bits(br, 3) + 3;
2238 rar_br_consume(br, 3);
2240 if (!rar_br_read_ahead(a, br, 7)) {
2242 free(precode.table);
2243 goto truncated_data;
2245 n = rar_br_bits(br, 7) + 11;
2246 rar_br_consume(br, 7);
2249 for (j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
2251 rar->lengthtable[i] = rar->lengthtable[i-1];
2258 if (!rar_br_read_ahead(a, br, 3)) {
2260 free(precode.table);
2261 goto truncated_data;
2263 n = rar_br_bits(br, 3) + 3;
2264 rar_br_consume(br, 3);
2266 if (!rar_br_read_ahead(a, br, 7)) {
2268 free(precode.table);
2269 goto truncated_data;
2271 n = rar_br_bits(br, 7) + 11;
2272 rar_br_consume(br, 7);
2275 for(j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
2276 rar->lengthtable[i++] = 0;
2280 free(precode.table);
2282 r = create_code(a, &rar->maincode, &rar->lengthtable[0], MAINCODE_SIZE,
2284 if (r != ARCHIVE_OK)
2286 r = create_code(a, &rar->offsetcode, &rar->lengthtable[MAINCODE_SIZE],
2287 OFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
2288 if (r != ARCHIVE_OK)
2290 r = create_code(a, &rar->lowoffsetcode,
2291 &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE],
2292 LOWOFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
2293 if (r != ARCHIVE_OK)
2295 r = create_code(a, &rar->lengthcode,
2296 &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE +
2297 LOWOFFSETCODE_SIZE], LENGTHCODE_SIZE, MAX_SYMBOL_LENGTH);
2298 if (r != ARCHIVE_OK)
2302 if (!rar->dictionary_size || !rar->lzss.window)
2304 /* Seems as though dictionary sizes are not used. Even so, minimize
2305 * memory usage as much as possible.
2308 unsigned int new_size;
2310 if (rar->unp_size >= DICTIONARY_MAX_SIZE)
2311 new_size = DICTIONARY_MAX_SIZE;
2313 new_size = rar_fls((unsigned int)rar->unp_size) << 1;
2314 new_window = realloc(rar->lzss.window, new_size);
2315 if (new_window == NULL) {
2316 archive_set_error(&a->archive, ENOMEM,
2317 "Unable to allocate memory for uncompressed data.");
2318 return (ARCHIVE_FATAL);
2320 rar->lzss.window = (unsigned char *)new_window;
2321 rar->dictionary_size = new_size;
2322 memset(rar->lzss.window, 0, rar->dictionary_size);
2323 rar->lzss.mask = rar->dictionary_size - 1;
2326 rar->start_new_table = 0;
2327 return (ARCHIVE_OK);
2329 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2330 "Truncated RAR file data");
2332 return (ARCHIVE_FATAL);
2336 free_codes(struct archive_read *a)
2338 struct rar *rar = (struct rar *)(a->format->data);
2339 free(rar->maincode.tree);
2340 free(rar->offsetcode.tree);
2341 free(rar->lowoffsetcode.tree);
2342 free(rar->lengthcode.tree);
2343 free(rar->maincode.table);
2344 free(rar->offsetcode.table);
2345 free(rar->lowoffsetcode.table);
2346 free(rar->lengthcode.table);
2347 memset(&rar->maincode, 0, sizeof(rar->maincode));
2348 memset(&rar->offsetcode, 0, sizeof(rar->offsetcode));
2349 memset(&rar->lowoffsetcode, 0, sizeof(rar->lowoffsetcode));
2350 memset(&rar->lengthcode, 0, sizeof(rar->lengthcode));
2355 read_next_symbol(struct archive_read *a, struct huffman_code *code)
2359 int length, value, node;
2365 if (make_table(a, code) != (ARCHIVE_OK))
2369 rar = (struct rar *)(a->format->data);
2372 /* Look ahead (peek) at bits */
2373 if (!rar_br_read_ahead(a, br, code->tablesize)) {
2374 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2375 "Truncated RAR file data");
2379 bits = rar_br_bits(br, code->tablesize);
2381 length = code->table[bits].length;
2382 value = code->table[bits].value;
2386 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2387 "Invalid prefix code in bitstream");
2391 if (length <= code->tablesize)
2393 /* Skip length bits */
2394 rar_br_consume(br, length);
2398 /* Skip tablesize bits */
2399 rar_br_consume(br, code->tablesize);
2402 while (!(code->tree[node].branches[0] ==
2403 code->tree[node].branches[1]))
2405 if (!rar_br_read_ahead(a, br, 1)) {
2406 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2407 "Truncated RAR file data");
2411 bit = rar_br_bits(br, 1);
2412 rar_br_consume(br, 1);
2414 if (code->tree[node].branches[bit] < 0)
2416 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2417 "Invalid prefix code in bitstream");
2420 node = code->tree[node].branches[bit];
2423 return code->tree[node].branches[0];
2427 create_code(struct archive_read *a, struct huffman_code *code,
2428 unsigned char *lengths, int numsymbols, char maxlength)
2430 int i, j, codebits = 0, symbolsleft = numsymbols;
2432 code->numentries = 0;
2433 code->numallocatedentries = 0;
2434 if (new_node(code) < 0) {
2435 archive_set_error(&a->archive, ENOMEM,
2436 "Unable to allocate memory for node data.");
2437 return (ARCHIVE_FATAL);
2439 code->numentries = 1;
2440 code->minlength = INT_MAX;
2441 code->maxlength = INT_MIN;
2443 for(i = 1; i <= maxlength; i++)
2445 for(j = 0; j < numsymbols; j++)
2447 if (lengths[j] != i) continue;
2448 if (add_value(a, code, j, codebits, i) != ARCHIVE_OK)
2449 return (ARCHIVE_FATAL);
2451 if (--symbolsleft <= 0) { break; break; }
2455 return (ARCHIVE_OK);
2459 add_value(struct archive_read *a, struct huffman_code *code, int value,
2460 int codebits, int length)
2462 int repeatpos, lastnode, bitpos, bit, repeatnode, nextnode;
2467 if(length > code->maxlength)
2468 code->maxlength = length;
2469 if(length < code->minlength)
2470 code->minlength = length;
2473 if (repeatpos == 0 || (repeatpos >= 0
2474 && (((codebits >> (repeatpos - 1)) & 3) == 0
2475 || ((codebits >> (repeatpos - 1)) & 3) == 3)))
2477 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2478 "Invalid repeat position");
2479 return (ARCHIVE_FATAL);
2483 for (bitpos = length - 1; bitpos >= 0; bitpos--)
2485 bit = (codebits >> bitpos) & 1;
2487 /* Leaf node check */
2488 if (code->tree[lastnode].branches[0] ==
2489 code->tree[lastnode].branches[1])
2491 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2493 return (ARCHIVE_FATAL);
2496 if (bitpos == repeatpos)
2498 /* Open branch check */
2499 if (!(code->tree[lastnode].branches[bit] < 0))
2501 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2502 "Invalid repeating code");
2503 return (ARCHIVE_FATAL);
2506 if ((repeatnode = new_node(code)) < 0) {
2507 archive_set_error(&a->archive, ENOMEM,
2508 "Unable to allocate memory for node data.");
2509 return (ARCHIVE_FATAL);
2511 if ((nextnode = new_node(code)) < 0) {
2512 archive_set_error(&a->archive, ENOMEM,
2513 "Unable to allocate memory for node data.");
2514 return (ARCHIVE_FATAL);
2518 code->tree[lastnode].branches[bit] = repeatnode;
2519 code->tree[repeatnode].branches[bit] = repeatnode;
2520 code->tree[repeatnode].branches[bit^1] = nextnode;
2521 lastnode = nextnode;
2523 bitpos++; /* terminating bit already handled, skip it */
2527 /* Open branch check */
2528 if (code->tree[lastnode].branches[bit] < 0)
2530 if (new_node(code) < 0) {
2531 archive_set_error(&a->archive, ENOMEM,
2532 "Unable to allocate memory for node data.");
2533 return (ARCHIVE_FATAL);
2535 code->tree[lastnode].branches[bit] = code->numentries++;
2539 lastnode = code->tree[lastnode].branches[bit];
2543 if (!(code->tree[lastnode].branches[0] == -1
2544 && code->tree[lastnode].branches[1] == -2))
2546 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2548 return (ARCHIVE_FATAL);
2551 /* Set leaf value */
2552 code->tree[lastnode].branches[0] = value;
2553 code->tree[lastnode].branches[1] = value;
2555 return (ARCHIVE_OK);
2559 new_node(struct huffman_code *code)
2562 if (code->numallocatedentries == code->numentries) {
2563 int new_num_entries = 256;
2564 if (code->numentries > 0) {
2565 new_num_entries = code->numentries * 2;
2567 new_tree = realloc(code->tree, new_num_entries * sizeof(*code->tree));
2568 if (new_tree == NULL)
2570 code->tree = (struct huffman_tree_node *)new_tree;
2571 code->numallocatedentries = new_num_entries;
2573 code->tree[code->numentries].branches[0] = -1;
2574 code->tree[code->numentries].branches[1] = -2;
2579 make_table(struct archive_read *a, struct huffman_code *code)
2581 if (code->maxlength < code->minlength || code->maxlength > 10)
2582 code->tablesize = 10;
2584 code->tablesize = code->maxlength;
2587 (struct huffman_table_entry *)calloc(1, sizeof(*code->table)
2588 * ((size_t)1 << code->tablesize));
2590 return make_table_recurse(a, code, 0, code->table, 0, code->tablesize);
2594 make_table_recurse(struct archive_read *a, struct huffman_code *code, int node,
2595 struct huffman_table_entry *table, int depth,
2598 int currtablesize, i, ret = (ARCHIVE_OK);
2602 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2603 "Huffman tree was not created.");
2604 return (ARCHIVE_FATAL);
2606 if (node < 0 || node >= code->numentries)
2608 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2609 "Invalid location to Huffman tree specified.");
2610 return (ARCHIVE_FATAL);
2613 currtablesize = 1 << (maxdepth - depth);
2615 if (code->tree[node].branches[0] ==
2616 code->tree[node].branches[1])
2618 for(i = 0; i < currtablesize; i++)
2620 table[i].length = depth;
2621 table[i].value = code->tree[node].branches[0];
2626 for(i = 0; i < currtablesize; i++)
2627 table[i].length = -1;
2631 if(depth == maxdepth)
2633 table[0].length = maxdepth + 1;
2634 table[0].value = node;
2638 ret |= make_table_recurse(a, code, code->tree[node].branches[0], table,
2639 depth + 1, maxdepth);
2640 ret |= make_table_recurse(a, code, code->tree[node].branches[1],
2641 table + currtablesize / 2, depth + 1, maxdepth);
2648 expand(struct archive_read *a, int64_t end)
2650 static const unsigned char lengthbases[] =
2651 { 0, 1, 2, 3, 4, 5, 6,
2652 7, 8, 10, 12, 14, 16, 20,
2653 24, 28, 32, 40, 48, 56, 64,
2654 80, 96, 112, 128, 160, 192, 224 };
2655 static const unsigned char lengthbits[] =
2656 { 0, 0, 0, 0, 0, 0, 0,
2657 0, 1, 1, 1, 1, 2, 2,
2658 2, 2, 3, 3, 3, 3, 4,
2659 4, 4, 4, 5, 5, 5, 5 };
2660 static const unsigned int offsetbases[] =
2662 8, 12, 16, 24, 32, 48,
2663 64, 96, 128, 192, 256, 384,
2664 512, 768, 1024, 1536, 2048, 3072,
2665 4096, 6144, 8192, 12288, 16384, 24576,
2666 32768, 49152, 65536, 98304, 131072, 196608,
2667 262144, 327680, 393216, 458752, 524288, 589824,
2668 655360, 720896, 786432, 851968, 917504, 983040,
2669 1048576, 1310720, 1572864, 1835008, 2097152, 2359296,
2670 2621440, 2883584, 3145728, 3407872, 3670016, 3932160 };
2671 static const unsigned char offsetbits[] =
2672 { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
2673 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10,
2674 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
2675 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
2676 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 };
2677 static const unsigned char shortbases[] =
2678 { 0, 4, 8, 16, 32, 64, 128, 192 };
2679 static const unsigned char shortbits[] =
2680 { 2, 2, 3, 4, 5, 6, 6, 6 };
2682 int symbol, offs, len, offsindex, lensymbol, i, offssymbol, lowoffsetsymbol;
2683 unsigned char newfile;
2684 struct rar *rar = (struct rar *)(a->format->data);
2685 struct rar_br *br = &(rar->br);
2687 if (rar->filterstart < end)
2688 end = rar->filterstart;
2692 if (rar->output_last_match &&
2693 lzss_position(&rar->lzss) + rar->lastlength <= end)
2695 lzss_emit_match(rar, rar->lastoffset, rar->lastlength);
2696 rar->output_last_match = 0;
2699 if(rar->is_ppmd_block || rar->output_last_match ||
2700 lzss_position(&rar->lzss) >= end)
2701 return lzss_position(&rar->lzss);
2703 if ((symbol = read_next_symbol(a, &rar->maincode)) < 0)
2704 return (ARCHIVE_FATAL);
2705 rar->output_last_match = 0;
2709 lzss_emit_literal(rar, symbol);
2712 else if (symbol == 256)
2714 if (!rar_br_read_ahead(a, br, 1))
2715 goto truncated_data;
2716 newfile = !rar_br_bits(br, 1);
2717 rar_br_consume(br, 1);
2721 rar->start_new_block = 1;
2722 if (!rar_br_read_ahead(a, br, 1))
2723 goto truncated_data;
2724 rar->start_new_table = rar_br_bits(br, 1);
2725 rar_br_consume(br, 1);
2726 return lzss_position(&rar->lzss);
2730 if (parse_codes(a) != ARCHIVE_OK)
2731 return (ARCHIVE_FATAL);
2735 else if(symbol==257)
2737 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
2738 "Parsing filters is unsupported.");
2739 return (ARCHIVE_FAILED);
2741 else if(symbol==258)
2743 if(rar->lastlength == 0)
2746 offs = rar->lastoffset;
2747 len = rar->lastlength;
2749 else if (symbol <= 262)
2751 offsindex = symbol - 259;
2752 offs = rar->oldoffset[offsindex];
2754 if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
2756 if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
2758 if (lensymbol > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
2760 len = lengthbases[lensymbol] + 2;
2761 if (lengthbits[lensymbol] > 0) {
2762 if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
2763 goto truncated_data;
2764 len += rar_br_bits(br, lengthbits[lensymbol]);
2765 rar_br_consume(br, lengthbits[lensymbol]);
2768 for (i = offsindex; i > 0; i--)
2769 rar->oldoffset[i] = rar->oldoffset[i-1];
2770 rar->oldoffset[0] = offs;
2772 else if(symbol<=270)
2774 offs = shortbases[symbol-263] + 1;
2775 if(shortbits[symbol-263] > 0) {
2776 if (!rar_br_read_ahead(a, br, shortbits[symbol-263]))
2777 goto truncated_data;
2778 offs += rar_br_bits(br, shortbits[symbol-263]);
2779 rar_br_consume(br, shortbits[symbol-263]);
2784 for(i = 3; i > 0; i--)
2785 rar->oldoffset[i] = rar->oldoffset[i-1];
2786 rar->oldoffset[0] = offs;
2790 if (symbol-271 > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
2792 if (symbol-271 > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
2794 len = lengthbases[symbol-271]+3;
2795 if(lengthbits[symbol-271] > 0) {
2796 if (!rar_br_read_ahead(a, br, lengthbits[symbol-271]))
2797 goto truncated_data;
2798 len += rar_br_bits(br, lengthbits[symbol-271]);
2799 rar_br_consume(br, lengthbits[symbol-271]);
2802 if ((offssymbol = read_next_symbol(a, &rar->offsetcode)) < 0)
2804 if (offssymbol > (int)(sizeof(offsetbases)/sizeof(offsetbases[0])))
2806 if (offssymbol > (int)(sizeof(offsetbits)/sizeof(offsetbits[0])))
2808 offs = offsetbases[offssymbol]+1;
2809 if(offsetbits[offssymbol] > 0)
2813 if(offsetbits[offssymbol] > 4) {
2814 if (!rar_br_read_ahead(a, br, offsetbits[offssymbol] - 4))
2815 goto truncated_data;
2816 offs += rar_br_bits(br, offsetbits[offssymbol] - 4) << 4;
2817 rar_br_consume(br, offsetbits[offssymbol] - 4);
2820 if(rar->numlowoffsetrepeats > 0)
2822 rar->numlowoffsetrepeats--;
2823 offs += rar->lastlowoffset;
2827 if ((lowoffsetsymbol =
2828 read_next_symbol(a, &rar->lowoffsetcode)) < 0)
2829 return (ARCHIVE_FATAL);
2830 if(lowoffsetsymbol == 16)
2832 rar->numlowoffsetrepeats = 15;
2833 offs += rar->lastlowoffset;
2837 offs += lowoffsetsymbol;
2838 rar->lastlowoffset = lowoffsetsymbol;
2843 if (!rar_br_read_ahead(a, br, offsetbits[offssymbol]))
2844 goto truncated_data;
2845 offs += rar_br_bits(br, offsetbits[offssymbol]);
2846 rar_br_consume(br, offsetbits[offssymbol]);
2850 if (offs >= 0x40000)
2855 for(i = 3; i > 0; i--)
2856 rar->oldoffset[i] = rar->oldoffset[i-1];
2857 rar->oldoffset[0] = offs;
2860 rar->lastoffset = offs;
2861 rar->lastlength = len;
2862 rar->output_last_match = 1;
2865 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2866 "Truncated RAR file data");
2868 return (ARCHIVE_FATAL);
2870 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2871 "Bad RAR file data");
2872 return (ARCHIVE_FATAL);
2876 copy_from_lzss_window(struct archive_read *a, const void **buffer,
2877 int64_t startpos, int length)
2879 int windowoffs, firstpart;
2880 struct rar *rar = (struct rar *)(a->format->data);
2882 if (!rar->unp_buffer)
2884 if ((rar->unp_buffer = malloc(rar->unp_buffer_size)) == NULL)
2886 archive_set_error(&a->archive, ENOMEM,
2887 "Unable to allocate memory for uncompressed data.");
2888 return (ARCHIVE_FATAL);
2892 windowoffs = lzss_offset_for_position(&rar->lzss, startpos);
2893 if(windowoffs + length <= lzss_size(&rar->lzss)) {
2894 memcpy(&rar->unp_buffer[rar->unp_offset], &rar->lzss.window[windowoffs],
2896 } else if (length <= lzss_size(&rar->lzss)) {
2897 firstpart = lzss_size(&rar->lzss) - windowoffs;
2898 if (firstpart < 0) {
2899 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2900 "Bad RAR file data");
2901 return (ARCHIVE_FATAL);
2903 if (firstpart < length) {
2904 memcpy(&rar->unp_buffer[rar->unp_offset],
2905 &rar->lzss.window[windowoffs], firstpart);
2906 memcpy(&rar->unp_buffer[rar->unp_offset + firstpart],
2907 &rar->lzss.window[0], length - firstpart);
2909 memcpy(&rar->unp_buffer[rar->unp_offset],
2910 &rar->lzss.window[windowoffs], length);
2913 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2914 "Bad RAR file data");
2915 return (ARCHIVE_FATAL);
2917 rar->unp_offset += length;
2918 if (rar->unp_offset >= rar->unp_buffer_size)
2919 *buffer = rar->unp_buffer;
2922 return (ARCHIVE_OK);
2926 rar_read_ahead(struct archive_read *a, size_t min, ssize_t *avail)
2928 struct rar *rar = (struct rar *)(a->format->data);
2929 const void *h = __archive_read_ahead(a, min, avail);
2933 if (a->archive.read_data_is_posix_read && *avail > (ssize_t)a->archive.read_data_requested)
2934 *avail = a->archive.read_data_requested;
2935 if (*avail > rar->bytes_remaining)
2936 *avail = (ssize_t)rar->bytes_remaining;
2939 else if (*avail == 0 && rar->main_flags & MHD_VOLUME &&
2940 rar->file_flags & FHD_SPLIT_AFTER)
2942 ret = archive_read_format_rar_read_header(a, a->entry);
2943 if (ret == (ARCHIVE_EOF))
2945 rar->has_endarc_header = 1;
2946 ret = archive_read_format_rar_read_header(a, a->entry);
2948 if (ret != (ARCHIVE_OK))
2950 return rar_read_ahead(a, min, avail);