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;
610 struct archive_read *a = ((IByteIn*)p)->a;
611 struct rar *rar = (struct rar *)(a->format->data);
612 struct rar_br *br = &(rar->br);
614 if (!rar_br_read_ahead(a, br, 8))
616 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
617 "Truncated RAR file data");
621 b = rar_br_bits(br, 8);
622 rar_br_consume(br, 8);
627 archive_read_support_format_rar(struct archive *_a)
629 struct archive_read *a = (struct archive_read *)_a;
633 archive_check_magic(_a, ARCHIVE_READ_MAGIC, ARCHIVE_STATE_NEW,
634 "archive_read_support_format_rar");
636 rar = (struct rar *)calloc(sizeof(*rar), 1);
639 archive_set_error(&a->archive, ENOMEM, "Can't allocate rar data");
640 return (ARCHIVE_FATAL);
644 * Until enough data has been read, we cannot tell about
645 * any encrypted entries yet.
647 rar->has_encrypted_entries = ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW;
649 r = __archive_read_register_format(a,
652 archive_read_format_rar_bid,
653 archive_read_format_rar_options,
654 archive_read_format_rar_read_header,
655 archive_read_format_rar_read_data,
656 archive_read_format_rar_read_data_skip,
657 archive_read_format_rar_seek_data,
658 archive_read_format_rar_cleanup,
659 archive_read_support_format_rar_capabilities,
660 archive_read_format_rar_has_encrypted_entries);
668 archive_read_support_format_rar_capabilities(struct archive_read * a)
670 (void)a; /* UNUSED */
671 return (ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_DATA
672 | ARCHIVE_READ_FORMAT_CAPS_ENCRYPT_METADATA);
676 archive_read_format_rar_has_encrypted_entries(struct archive_read *_a)
678 if (_a && _a->format) {
679 struct rar * rar = (struct rar *)_a->format->data;
681 return rar->has_encrypted_entries;
684 return ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW;
689 archive_read_format_rar_bid(struct archive_read *a, int best_bid)
693 /* If there's already a bid > 30, we'll never win. */
697 if ((p = __archive_read_ahead(a, 7, NULL)) == NULL)
700 if (memcmp(p, RAR_SIGNATURE, 7) == 0)
703 if ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0) {
704 /* This is a PE file */
705 ssize_t offset = 0x10000;
706 ssize_t window = 4096;
708 while (offset + window <= (1024 * 128)) {
709 const char *buff = __archive_read_ahead(a, offset + window, &bytes_avail);
711 /* Remaining bytes are less than window. */
718 while (p + 7 < buff + bytes_avail) {
719 if (memcmp(p, RAR_SIGNATURE, 7) == 0)
730 skip_sfx(struct archive_read *a)
735 ssize_t bytes, window;
739 while (total + window <= (1024 * 128)) {
740 h = __archive_read_ahead(a, window, &bytes);
742 /* Remaining bytes are less than window. */
754 * Scan ahead until we find something that looks
755 * like the RAR header.
758 if (memcmp(p, RAR_SIGNATURE, 7) == 0) {
759 skip = p - (const char *)h;
760 __archive_read_consume(a, skip);
765 skip = p - (const char *)h;
766 __archive_read_consume(a, skip);
770 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
771 "Couldn't find out RAR header");
772 return (ARCHIVE_FATAL);
776 archive_read_format_rar_options(struct archive_read *a,
777 const char *key, const char *val)
780 int ret = ARCHIVE_FAILED;
782 rar = (struct rar *)(a->format->data);
783 if (strcmp(key, "hdrcharset") == 0) {
784 if (val == NULL || val[0] == 0)
785 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
786 "rar: hdrcharset option needs a character-set name");
789 archive_string_conversion_from_charset(
790 &a->archive, val, 0);
791 if (rar->opt_sconv != NULL)
799 /* Note: The "warn" return is just to inform the options
800 * supervisor that we didn't handle it. It will generate
801 * a suitable error if no one used this option. */
802 return (ARCHIVE_WARN);
806 archive_read_format_rar_read_header(struct archive_read *a,
807 struct archive_entry *entry)
816 unsigned long crc32_expected;
818 a->archive.archive_format = ARCHIVE_FORMAT_RAR;
819 if (a->archive.archive_format_name == NULL)
820 a->archive.archive_format_name = "RAR";
822 rar = (struct rar *)(a->format->data);
825 * It should be sufficient to call archive_read_next_header() for
826 * a reader to determine if an entry is encrypted or not. If the
827 * encryption of an entry is only detectable when calling
828 * archive_read_data(), so be it. We'll do the same check there
831 if (rar->has_encrypted_entries == ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW) {
832 rar->has_encrypted_entries = 0;
835 /* RAR files can be generated without EOF headers, so return ARCHIVE_EOF if
838 if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
839 return (ARCHIVE_EOF);
842 if (rar->found_first_header == 0 &&
843 ((p[0] == 'M' && p[1] == 'Z') || memcmp(p, "\x7F\x45LF", 4) == 0)) {
844 /* This is an executable ? Must be self-extracting... */
846 if (ret < ARCHIVE_WARN)
849 rar->found_first_header = 1;
853 unsigned long crc32_val;
855 if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
856 return (ARCHIVE_FATAL);
863 if (memcmp(p, RAR_SIGNATURE, 7) != 0) {
864 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
865 "Invalid marker header");
866 return (ARCHIVE_FATAL);
868 __archive_read_consume(a, 7);
872 rar->main_flags = archive_le16dec(p + 3);
873 skip = archive_le16dec(p + 5);
874 if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)) {
875 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
876 "Invalid header size");
877 return (ARCHIVE_FATAL);
879 if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
880 return (ARCHIVE_FATAL);
882 memcpy(rar->reserved1, p + 7, sizeof(rar->reserved1));
883 memcpy(rar->reserved2, p + 7 + sizeof(rar->reserved1),
884 sizeof(rar->reserved2));
885 if (rar->main_flags & MHD_ENCRYPTVER) {
886 if (skip < 7 + sizeof(rar->reserved1) + sizeof(rar->reserved2)+1) {
887 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
888 "Invalid header size");
889 return (ARCHIVE_FATAL);
891 rar->encryptver = *(p + 7 + sizeof(rar->reserved1) +
892 sizeof(rar->reserved2));
895 /* Main header is password encrypted, so we cannot read any
896 file names or any other info about files from the header. */
897 if (rar->main_flags & MHD_PASSWORD)
899 archive_entry_set_is_metadata_encrypted(entry, 1);
900 archive_entry_set_is_data_encrypted(entry, 1);
901 rar->has_encrypted_entries = 1;
902 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
903 "RAR encryption support unavailable.");
904 return (ARCHIVE_FATAL);
907 crc32_val = crc32(0, (const unsigned char *)p + 2, (unsigned)skip - 2);
908 if ((crc32_val & 0xffff) != archive_le16dec(p)) {
909 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
911 return (ARCHIVE_FATAL);
913 __archive_read_consume(a, skip);
917 return read_header(a, entry, head_type);
925 flags = archive_le16dec(p + 3);
926 skip = archive_le16dec(p + 5);
928 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
929 "Invalid header size too small");
930 return (ARCHIVE_FATAL);
932 if (flags & HD_ADD_SIZE_PRESENT)
935 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
936 "Invalid header size too small");
937 return (ARCHIVE_FATAL);
939 if ((h = __archive_read_ahead(a, skip, NULL)) == NULL)
940 return (ARCHIVE_FATAL);
942 skip += archive_le32dec(p + 7);
945 /* Skip over the 2-byte CRC at the beginning of the header. */
946 crc32_expected = archive_le16dec(p);
947 __archive_read_consume(a, 2);
950 /* Skim the entire header and compute the CRC. */
953 size_t to_read = skip;
955 if (to_read > 32 * 1024) {
958 if ((h = __archive_read_ahead(a, to_read, &did_read)) == NULL) {
959 return (ARCHIVE_FATAL);
962 crc32_val = crc32(crc32_val, (const unsigned char *)p, (unsigned)did_read);
963 __archive_read_consume(a, did_read);
966 if ((crc32_val & 0xffff) != crc32_expected) {
967 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
969 return (ARCHIVE_FATAL);
971 if (head_type == ENDARC_HEAD)
972 return (ARCHIVE_EOF);
976 if ((ret = read_header(a, entry, head_type)) < ARCHIVE_WARN)
981 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
983 return (ARCHIVE_FATAL);
989 archive_read_format_rar_read_data(struct archive_read *a, const void **buff,
990 size_t *size, int64_t *offset)
992 struct rar *rar = (struct rar *)(a->format->data);
995 if (rar->has_encrypted_entries == ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW) {
996 rar->has_encrypted_entries = 0;
999 if (rar->bytes_unconsumed > 0) {
1000 /* Consume as much as the decompressor actually used. */
1001 __archive_read_consume(a, rar->bytes_unconsumed);
1002 rar->bytes_unconsumed = 0;
1006 if (rar->entry_eof || rar->offset_seek >= rar->unp_size) {
1008 *offset = rar->offset;
1009 if (*offset < rar->unp_size)
1010 *offset = rar->unp_size;
1011 return (ARCHIVE_EOF);
1014 switch (rar->compression_method)
1016 case COMPRESS_METHOD_STORE:
1017 ret = read_data_stored(a, buff, size, offset);
1020 case COMPRESS_METHOD_FASTEST:
1021 case COMPRESS_METHOD_FAST:
1022 case COMPRESS_METHOD_NORMAL:
1023 case COMPRESS_METHOD_GOOD:
1024 case COMPRESS_METHOD_BEST:
1025 ret = read_data_compressed(a, buff, size, offset);
1026 if (ret != ARCHIVE_OK && ret != ARCHIVE_WARN) {
1027 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);
1028 rar->start_new_table = 1;
1029 rar->ppmd_valid = 0;
1034 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1035 "Unsupported compression method for RAR file.");
1036 ret = ARCHIVE_FATAL;
1043 archive_read_format_rar_read_data_skip(struct archive_read *a)
1046 int64_t bytes_skipped;
1049 rar = (struct rar *)(a->format->data);
1051 if (rar->bytes_unconsumed > 0) {
1052 /* Consume as much as the decompressor actually used. */
1053 __archive_read_consume(a, rar->bytes_unconsumed);
1054 rar->bytes_unconsumed = 0;
1057 if (rar->bytes_remaining > 0) {
1058 bytes_skipped = __archive_read_consume(a, rar->bytes_remaining);
1059 if (bytes_skipped < 0)
1060 return (ARCHIVE_FATAL);
1063 /* Compressed data to skip must be read from each header in a multivolume
1066 if (rar->main_flags & MHD_VOLUME && rar->file_flags & FHD_SPLIT_AFTER)
1068 ret = archive_read_format_rar_read_header(a, a->entry);
1069 if (ret == (ARCHIVE_EOF))
1070 ret = archive_read_format_rar_read_header(a, a->entry);
1071 if (ret != (ARCHIVE_OK))
1073 return archive_read_format_rar_read_data_skip(a);
1076 return (ARCHIVE_OK);
1080 archive_read_format_rar_seek_data(struct archive_read *a, int64_t offset,
1083 int64_t client_offset, ret;
1085 struct rar *rar = (struct rar *)(a->format->data);
1087 if (rar->compression_method == COMPRESS_METHOD_STORE)
1089 /* Modify the offset for use with SEEK_SET */
1093 client_offset = rar->offset_seek;
1096 client_offset = rar->unp_size;
1102 client_offset += offset;
1103 if (client_offset < 0)
1105 /* Can't seek past beginning of data block */
1108 else if (client_offset > rar->unp_size)
1111 * Set the returned offset but only seek to the end of
1114 rar->offset_seek = client_offset;
1115 client_offset = rar->unp_size;
1118 client_offset += rar->dbo[0].start_offset;
1120 while (i < rar->cursor)
1123 client_offset += rar->dbo[i].start_offset - rar->dbo[i-1].end_offset;
1125 if (rar->main_flags & MHD_VOLUME)
1127 /* Find the appropriate offset among the multivolume archive */
1130 if (client_offset < rar->dbo[rar->cursor].start_offset &&
1131 rar->file_flags & FHD_SPLIT_BEFORE)
1133 /* Search backwards for the correct data block */
1134 if (rar->cursor == 0)
1136 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1137 "Attempt to seek past beginning of RAR data block");
1138 return (ARCHIVE_FAILED);
1141 client_offset -= rar->dbo[rar->cursor+1].start_offset -
1142 rar->dbo[rar->cursor].end_offset;
1143 if (client_offset < rar->dbo[rar->cursor].start_offset)
1145 ret = __archive_read_seek(a, rar->dbo[rar->cursor].start_offset -
1146 rar->dbo[rar->cursor].header_size, SEEK_SET);
1147 if (ret < (ARCHIVE_OK))
1149 ret = archive_read_format_rar_read_header(a, a->entry);
1150 if (ret != (ARCHIVE_OK))
1152 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1153 "Error during seek of RAR file");
1154 return (ARCHIVE_FAILED);
1159 else if (client_offset > rar->dbo[rar->cursor].end_offset &&
1160 rar->file_flags & FHD_SPLIT_AFTER)
1162 /* Search forward for the correct data block */
1164 if (rar->cursor < rar->nodes &&
1165 client_offset > rar->dbo[rar->cursor].end_offset)
1167 client_offset += rar->dbo[rar->cursor].start_offset -
1168 rar->dbo[rar->cursor-1].end_offset;
1172 ret = __archive_read_seek(a, rar->dbo[rar->cursor].end_offset,
1174 if (ret < (ARCHIVE_OK))
1176 ret = archive_read_format_rar_read_header(a, a->entry);
1177 if (ret == (ARCHIVE_EOF))
1179 rar->has_endarc_header = 1;
1180 ret = archive_read_format_rar_read_header(a, a->entry);
1182 if (ret != (ARCHIVE_OK))
1184 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1185 "Error during seek of RAR file");
1186 return (ARCHIVE_FAILED);
1188 client_offset += rar->dbo[rar->cursor].start_offset -
1189 rar->dbo[rar->cursor-1].end_offset;
1196 ret = __archive_read_seek(a, client_offset, SEEK_SET);
1197 if (ret < (ARCHIVE_OK))
1199 rar->bytes_remaining = rar->dbo[rar->cursor].end_offset - ret;
1204 ret -= rar->dbo[i+1].start_offset - rar->dbo[i].end_offset;
1206 ret -= rar->dbo[0].start_offset;
1208 /* Always restart reading the file after a seek */
1209 __archive_reset_read_data(&a->archive);
1211 rar->bytes_unconsumed = 0;
1215 * If a seek past the end of file was requested, return the requested
1218 if (ret == rar->unp_size && rar->offset_seek > rar->unp_size)
1219 return rar->offset_seek;
1221 /* Return the new offset */
1222 rar->offset_seek = ret;
1223 return rar->offset_seek;
1227 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1228 "Seeking of compressed RAR files is unsupported");
1230 return (ARCHIVE_FAILED);
1234 archive_read_format_rar_cleanup(struct archive_read *a)
1238 rar = (struct rar *)(a->format->data);
1240 free(rar->filename);
1241 free(rar->filename_save);
1243 free(rar->unp_buffer);
1244 free(rar->lzss.window);
1245 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);
1247 (a->format->data) = NULL;
1248 return (ARCHIVE_OK);
1252 read_header(struct archive_read *a, struct archive_entry *entry,
1256 const char *p, *endp;
1258 struct rar_header rar_header;
1259 struct rar_file_header file_header;
1260 int64_t header_size;
1261 unsigned filename_size, end;
1264 char packed_size[8];
1267 struct archive_string_conv *sconv, *fn_sconv;
1268 unsigned long crc32_val;
1269 int ret = (ARCHIVE_OK), ret2;
1271 rar = (struct rar *)(a->format->data);
1273 /* Setup a string conversion object for non-rar-unicode filenames. */
1274 sconv = rar->opt_sconv;
1275 if (sconv == NULL) {
1276 if (!rar->init_default_conversion) {
1277 rar->sconv_default =
1278 archive_string_default_conversion_for_read(
1280 rar->init_default_conversion = 1;
1282 sconv = rar->sconv_default;
1286 if ((h = __archive_read_ahead(a, 7, NULL)) == NULL)
1287 return (ARCHIVE_FATAL);
1289 memcpy(&rar_header, p, sizeof(rar_header));
1290 rar->file_flags = archive_le16dec(rar_header.flags);
1291 header_size = archive_le16dec(rar_header.size);
1292 if (header_size < (int64_t)sizeof(file_header) + 7) {
1293 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1294 "Invalid header size");
1295 return (ARCHIVE_FATAL);
1297 crc32_val = crc32(0, (const unsigned char *)p + 2, 7 - 2);
1298 __archive_read_consume(a, 7);
1300 if (!(rar->file_flags & FHD_SOLID))
1302 rar->compression_method = 0;
1303 rar->packed_size = 0;
1310 memset(&rar->salt, 0, sizeof(rar->salt));
1322 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1323 "RAR solid archive support unavailable.");
1324 return (ARCHIVE_FATAL);
1327 if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL)
1328 return (ARCHIVE_FATAL);
1330 /* File Header CRC check. */
1331 crc32_val = crc32(crc32_val, h, (unsigned)(header_size - 7));
1332 if ((crc32_val & 0xffff) != archive_le16dec(rar_header.crc)) {
1333 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1334 "Header CRC error");
1335 return (ARCHIVE_FATAL);
1337 /* If no CRC error, Go on parsing File Header. */
1339 endp = p + header_size - 7;
1340 memcpy(&file_header, p, sizeof(file_header));
1341 p += sizeof(file_header);
1343 rar->compression_method = file_header.method;
1345 ttime = archive_le32dec(file_header.file_time);
1346 rar->mtime = get_time(ttime);
1348 rar->file_crc = archive_le32dec(file_header.file_crc);
1350 if (rar->file_flags & FHD_PASSWORD)
1352 archive_entry_set_is_data_encrypted(entry, 1);
1353 rar->has_encrypted_entries = 1;
1354 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1355 "RAR encryption support unavailable.");
1356 /* Since it is only the data part itself that is encrypted we can at least
1357 extract information about the currently processed entry and don't need
1358 to return ARCHIVE_FATAL here. */
1359 /*return (ARCHIVE_FATAL);*/
1362 if (rar->file_flags & FHD_LARGE)
1364 memcpy(packed_size, file_header.pack_size, 4);
1365 memcpy(packed_size + 4, p, 4); /* High pack size */
1367 memcpy(unp_size, file_header.unp_size, 4);
1368 memcpy(unp_size + 4, p, 4); /* High unpack size */
1370 rar->packed_size = archive_le64dec(&packed_size);
1371 rar->unp_size = archive_le64dec(&unp_size);
1375 rar->packed_size = archive_le32dec(file_header.pack_size);
1376 rar->unp_size = archive_le32dec(file_header.unp_size);
1379 if (rar->packed_size < 0 || rar->unp_size < 0)
1381 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1382 "Invalid sizes specified.");
1383 return (ARCHIVE_FATAL);
1386 rar->bytes_remaining = rar->packed_size;
1388 /* TODO: RARv3 subblocks contain comments. For now the complete block is
1389 * consumed at the end.
1391 if (head_type == NEWSUB_HEAD) {
1392 size_t distance = p - (const char *)h;
1393 header_size += rar->packed_size;
1394 /* Make sure we have the extended data. */
1395 if ((h = __archive_read_ahead(a, (size_t)header_size - 7, NULL)) == NULL)
1396 return (ARCHIVE_FATAL);
1398 endp = p + header_size - 7;
1402 filename_size = archive_le16dec(file_header.name_size);
1403 if (p + filename_size > endp) {
1404 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1405 "Invalid filename size");
1406 return (ARCHIVE_FATAL);
1408 if (rar->filename_allocated < filename_size * 2 + 2) {
1410 size_t newsize = filename_size * 2 + 2;
1411 newptr = realloc(rar->filename, newsize);
1412 if (newptr == NULL) {
1413 archive_set_error(&a->archive, ENOMEM,
1414 "Couldn't allocate memory.");
1415 return (ARCHIVE_FATAL);
1417 rar->filename = newptr;
1418 rar->filename_allocated = newsize;
1420 filename = rar->filename;
1421 memcpy(filename, p, filename_size);
1422 filename[filename_size] = '\0';
1423 if (rar->file_flags & FHD_UNICODE)
1425 if (filename_size != strlen(filename))
1427 unsigned char highbyte, flagbits, flagbyte;
1428 unsigned fn_end, offset;
1430 end = filename_size;
1431 fn_end = filename_size * 2;
1433 offset = (unsigned)strlen(filename) + 1;
1434 highbyte = *(p + offset++);
1437 while (offset < end && filename_size < fn_end)
1441 flagbyte = *(p + offset++);
1446 switch((flagbyte >> flagbits) & 3)
1449 filename[filename_size++] = '\0';
1450 filename[filename_size++] = *(p + offset++);
1453 filename[filename_size++] = highbyte;
1454 filename[filename_size++] = *(p + offset++);
1457 filename[filename_size++] = *(p + offset + 1);
1458 filename[filename_size++] = *(p + offset);
1464 uint8_t length = *(p + offset++);
1466 if (length & 0x80) {
1467 extra = *(p + offset++);
1468 high = (char)highbyte;
1471 length = (length & 0x7f) + 2;
1472 while (length && filename_size < fn_end) {
1473 unsigned cp = filename_size >> 1;
1474 filename[filename_size++] = high;
1475 filename[filename_size++] = p[cp] + extra;
1482 if (filename_size > fn_end) {
1483 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1484 "Invalid filename");
1485 return (ARCHIVE_FATAL);
1487 filename[filename_size++] = '\0';
1489 * Do not increment filename_size here as the computations below
1490 * add the space for the terminating NUL explicitly.
1492 filename[filename_size] = '\0';
1494 /* Decoded unicode form is UTF-16BE, so we have to update a string
1495 * conversion object for it. */
1496 if (rar->sconv_utf16be == NULL) {
1497 rar->sconv_utf16be = archive_string_conversion_from_charset(
1498 &a->archive, "UTF-16BE", 1);
1499 if (rar->sconv_utf16be == NULL)
1500 return (ARCHIVE_FATAL);
1502 fn_sconv = rar->sconv_utf16be;
1505 while (memcmp(strp, "\x00\x00", 2))
1507 if (!memcmp(strp, "\x00\\", 2))
1514 * If FHD_UNICODE is set but no unicode data, this file name form
1515 * is UTF-8, so we have to update a string conversion object for
1518 if (rar->sconv_utf8 == NULL) {
1519 rar->sconv_utf8 = archive_string_conversion_from_charset(
1520 &a->archive, "UTF-8", 1);
1521 if (rar->sconv_utf8 == NULL)
1522 return (ARCHIVE_FATAL);
1524 fn_sconv = rar->sconv_utf8;
1525 while ((strp = strchr(filename, '\\')) != NULL)
1533 while ((strp = strchr(filename, '\\')) != NULL)
1538 /* Split file in multivolume RAR. No more need to process header. */
1539 if (rar->filename_save &&
1540 filename_size == rar->filename_save_size &&
1541 !memcmp(rar->filename, rar->filename_save, filename_size + 1))
1543 __archive_read_consume(a, header_size - 7);
1545 if (rar->cursor >= rar->nodes)
1549 realloc(rar->dbo, sizeof(*rar->dbo) * rar->nodes)) == NULL)
1551 archive_set_error(&a->archive, ENOMEM, "Couldn't allocate memory.");
1552 return (ARCHIVE_FATAL);
1554 rar->dbo[rar->cursor].header_size = header_size;
1555 rar->dbo[rar->cursor].start_offset = -1;
1556 rar->dbo[rar->cursor].end_offset = -1;
1558 if (rar->dbo[rar->cursor].start_offset < 0)
1560 rar->dbo[rar->cursor].start_offset = a->filter->position;
1561 rar->dbo[rar->cursor].end_offset = rar->dbo[rar->cursor].start_offset +
1567 rar->filename_save = (char*)realloc(rar->filename_save,
1569 memcpy(rar->filename_save, rar->filename, filename_size + 1);
1570 rar->filename_save_size = filename_size;
1572 /* Set info for seeking */
1574 if ((rar->dbo = calloc(1, sizeof(*rar->dbo))) == NULL)
1576 archive_set_error(&a->archive, ENOMEM, "Couldn't allocate memory.");
1577 return (ARCHIVE_FATAL);
1579 rar->dbo[0].header_size = header_size;
1580 rar->dbo[0].start_offset = -1;
1581 rar->dbo[0].end_offset = -1;
1585 if (rar->file_flags & FHD_SALT)
1588 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1589 "Invalid header size");
1590 return (ARCHIVE_FATAL);
1592 memcpy(rar->salt, p, 8);
1596 if (rar->file_flags & FHD_EXTTIME) {
1597 if (read_exttime(p, rar, endp) < 0) {
1598 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1599 "Invalid header size");
1600 return (ARCHIVE_FATAL);
1604 __archive_read_consume(a, header_size - 7);
1605 rar->dbo[0].start_offset = a->filter->position;
1606 rar->dbo[0].end_offset = rar->dbo[0].start_offset + rar->packed_size;
1608 switch(file_header.host_os)
1613 rar->mode = archive_le32dec(file_header.file_attr);
1614 if (rar->mode & FILE_ATTRIBUTE_DIRECTORY)
1615 rar->mode = AE_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
1617 rar->mode = AE_IFREG;
1618 rar->mode |= S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
1624 rar->mode = archive_le32dec(file_header.file_attr);
1628 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1629 "Unknown file attributes from RAR file's host OS");
1630 return (ARCHIVE_FATAL);
1633 rar->bytes_uncopied = rar->bytes_unconsumed = 0;
1634 rar->lzss.position = rar->offset = 0;
1635 rar->offset_seek = 0;
1636 rar->dictionary_size = 0;
1637 rar->offset_outgoing = 0;
1638 rar->br.cache_avail = 0;
1639 rar->br.avail_in = 0;
1640 rar->crc_calculated = 0;
1643 rar->is_ppmd_block = 0;
1644 rar->start_new_table = 1;
1645 free(rar->unp_buffer);
1646 rar->unp_buffer = NULL;
1647 rar->unp_offset = 0;
1648 rar->unp_buffer_size = UNP_BUFFER_SIZE;
1649 memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
1650 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);
1651 rar->ppmd_valid = rar->ppmd_eod = 0;
1653 /* Don't set any archive entries for non-file header types */
1654 if (head_type == NEWSUB_HEAD)
1657 archive_entry_set_mtime(entry, rar->mtime, rar->mnsec);
1658 archive_entry_set_ctime(entry, rar->ctime, rar->cnsec);
1659 archive_entry_set_atime(entry, rar->atime, rar->ansec);
1660 archive_entry_set_size(entry, rar->unp_size);
1661 archive_entry_set_mode(entry, rar->mode);
1663 if (archive_entry_copy_pathname_l(entry, filename, filename_size, fn_sconv))
1665 if (errno == ENOMEM)
1667 archive_set_error(&a->archive, ENOMEM,
1668 "Can't allocate memory for Pathname");
1669 return (ARCHIVE_FATAL);
1671 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1672 "Pathname cannot be converted from %s to current locale.",
1673 archive_string_conversion_charset_name(fn_sconv));
1674 ret = (ARCHIVE_WARN);
1677 if (((rar->mode) & AE_IFMT) == AE_IFLNK)
1679 /* Make sure a symbolic-link file does not have its body. */
1680 rar->bytes_remaining = 0;
1681 archive_entry_set_size(entry, 0);
1683 /* Read a symbolic-link name. */
1684 if ((ret2 = read_symlink_stored(a, entry, sconv)) < (ARCHIVE_WARN))
1690 if (rar->bytes_remaining == 0)
1700 tm.tm_sec = 2 * (ttime & 0x1f);
1701 tm.tm_min = (ttime >> 5) & 0x3f;
1702 tm.tm_hour = (ttime >> 11) & 0x1f;
1703 tm.tm_mday = (ttime >> 16) & 0x1f;
1704 tm.tm_mon = ((ttime >> 21) & 0x0f) - 1;
1705 tm.tm_year = ((ttime >> 25) & 0x7f) + 80;
1711 read_exttime(const char *p, struct rar *rar, const char *endp)
1713 unsigned rmode, flags, rem, j, count;
1721 flags = archive_le16dec(p);
1724 for (i = 3; i >= 0; i--)
1729 rmode = flags >> i * 4;
1736 ttime = archive_le32dec(p);
1737 t = get_time(ttime);
1742 if (p + count > endp)
1744 for (j = 0; j < count; j++)
1746 rem = (((unsigned)(unsigned char)*p) << 16) | (rem >> 8);
1750 nsec = tm->tm_sec + rem / NS_UNIT;
1774 rar->arcnsec = nsec;
1782 read_symlink_stored(struct archive_read *a, struct archive_entry *entry,
1783 struct archive_string_conv *sconv)
1788 int ret = (ARCHIVE_OK);
1790 rar = (struct rar *)(a->format->data);
1791 if ((h = rar_read_ahead(a, (size_t)rar->packed_size, NULL)) == NULL)
1792 return (ARCHIVE_FATAL);
1795 if (archive_entry_copy_symlink_l(entry,
1796 p, (size_t)rar->packed_size, sconv))
1798 if (errno == ENOMEM)
1800 archive_set_error(&a->archive, ENOMEM,
1801 "Can't allocate memory for link");
1802 return (ARCHIVE_FATAL);
1804 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1805 "link cannot be converted from %s to current locale.",
1806 archive_string_conversion_charset_name(sconv));
1807 ret = (ARCHIVE_WARN);
1809 __archive_read_consume(a, rar->packed_size);
1814 read_data_stored(struct archive_read *a, const void **buff, size_t *size,
1818 ssize_t bytes_avail;
1820 rar = (struct rar *)(a->format->data);
1821 if (rar->bytes_remaining == 0 &&
1822 !(rar->main_flags & MHD_VOLUME && rar->file_flags & FHD_SPLIT_AFTER))
1826 *offset = rar->offset;
1827 if (rar->file_crc != rar->crc_calculated) {
1828 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1830 return (ARCHIVE_FATAL);
1833 return (ARCHIVE_EOF);
1836 *buff = rar_read_ahead(a, 1, &bytes_avail);
1837 if (bytes_avail <= 0)
1839 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1840 "Truncated RAR file data");
1841 return (ARCHIVE_FATAL);
1844 *size = bytes_avail;
1845 *offset = rar->offset;
1846 rar->offset += bytes_avail;
1847 rar->offset_seek += bytes_avail;
1848 rar->bytes_remaining -= bytes_avail;
1849 rar->bytes_unconsumed = bytes_avail;
1850 /* Calculate File CRC. */
1851 rar->crc_calculated = crc32(rar->crc_calculated, *buff,
1852 (unsigned)bytes_avail);
1853 return (ARCHIVE_OK);
1857 read_data_compressed(struct archive_read *a, const void **buff, size_t *size,
1861 int64_t start, end, actualend;
1863 int ret = (ARCHIVE_OK), sym, code, lzss_offset, length, i;
1865 rar = (struct rar *)(a->format->data);
1869 return (ARCHIVE_FATAL);
1870 if (rar->ppmd_eod ||
1871 (rar->dictionary_size && rar->offset >= rar->unp_size))
1873 if (rar->unp_offset > 0) {
1875 * We have unprocessed extracted data. write it out.
1877 *buff = rar->unp_buffer;
1878 *size = rar->unp_offset;
1879 *offset = rar->offset_outgoing;
1880 rar->offset_outgoing += *size;
1881 /* Calculate File CRC. */
1882 rar->crc_calculated = crc32(rar->crc_calculated, *buff,
1884 rar->unp_offset = 0;
1885 return (ARCHIVE_OK);
1889 *offset = rar->offset;
1890 if (rar->file_crc != rar->crc_calculated) {
1891 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1893 return (ARCHIVE_FATAL);
1896 return (ARCHIVE_EOF);
1899 if (!rar->is_ppmd_block && rar->dictionary_size && rar->bytes_uncopied > 0)
1901 if (rar->bytes_uncopied > (rar->unp_buffer_size - rar->unp_offset))
1902 bs = rar->unp_buffer_size - rar->unp_offset;
1904 bs = (size_t)rar->bytes_uncopied;
1905 ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs);
1906 if (ret != ARCHIVE_OK)
1909 rar->bytes_uncopied -= bs;
1910 if (*buff != NULL) {
1911 rar->unp_offset = 0;
1912 *size = rar->unp_buffer_size;
1913 *offset = rar->offset_outgoing;
1914 rar->offset_outgoing += *size;
1915 /* Calculate File CRC. */
1916 rar->crc_calculated = crc32(rar->crc_calculated, *buff,
1923 if (!rar->br.next_in &&
1924 (ret = rar_br_preparation(a, &(rar->br))) < ARCHIVE_WARN)
1926 if (rar->start_new_table && ((ret = parse_codes(a)) < (ARCHIVE_WARN)))
1929 if (rar->is_ppmd_block)
1931 if ((sym = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1932 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1934 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1936 return (ARCHIVE_FATAL);
1938 if(sym != rar->ppmd_escape)
1940 lzss_emit_literal(rar, sym);
1941 rar->bytes_uncopied++;
1945 if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1946 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1948 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1950 return (ARCHIVE_FATAL);
1956 rar->start_new_table = 1;
1957 return read_data_compressed(a, buff, size, offset);
1960 rar->ppmd_eod = 1;/* End Of ppmd Data. */
1964 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
1965 "Parsing filters is unsupported.");
1966 return (ARCHIVE_FAILED);
1970 for (i = 2; i >= 0; i--)
1972 if ((code = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1973 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1975 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1977 return (ARCHIVE_FATAL);
1979 lzss_offset |= code << (i * 8);
1981 if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1982 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1984 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1986 return (ARCHIVE_FATAL);
1988 lzss_emit_match(rar, lzss_offset + 2, length + 32);
1989 rar->bytes_uncopied += length + 32;
1993 if ((length = __archive_ppmd7_functions.Ppmd7_DecodeSymbol(
1994 &rar->ppmd7_context, &rar->range_dec.p)) < 0)
1996 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
1998 return (ARCHIVE_FATAL);
2000 lzss_emit_match(rar, 1, length + 4);
2001 rar->bytes_uncopied += length + 4;
2005 lzss_emit_literal(rar, sym);
2006 rar->bytes_uncopied++;
2012 start = rar->offset;
2013 end = start + rar->dictionary_size;
2014 rar->filterstart = INT64_MAX;
2016 if ((actualend = expand(a, end)) < 0)
2017 return ((int)actualend);
2019 rar->bytes_uncopied = actualend - start;
2020 if (rar->bytes_uncopied == 0) {
2021 /* Broken RAR files cause this case.
2022 * NOTE: If this case were possible on a normal RAR file
2023 * we would find out where it was actually bad and
2024 * what we would do to solve it. */
2025 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2026 "Internal error extracting RAR file");
2027 return (ARCHIVE_FATAL);
2030 if (rar->bytes_uncopied > (rar->unp_buffer_size - rar->unp_offset))
2031 bs = rar->unp_buffer_size - rar->unp_offset;
2033 bs = (size_t)rar->bytes_uncopied;
2034 ret = copy_from_lzss_window(a, buff, rar->offset, (int)bs);
2035 if (ret != ARCHIVE_OK)
2038 rar->bytes_uncopied -= bs;
2040 * If *buff is NULL, it means unp_buffer is not full.
2041 * So we have to continue extracting a RAR file.
2043 } while (*buff == NULL);
2045 rar->unp_offset = 0;
2046 *size = rar->unp_buffer_size;
2047 *offset = rar->offset_outgoing;
2048 rar->offset_outgoing += *size;
2049 /* Calculate File CRC. */
2050 rar->crc_calculated = crc32(rar->crc_calculated, *buff, (unsigned)*size);
2055 parse_codes(struct archive_read *a)
2057 int i, j, val, n, r;
2058 unsigned char bitlengths[MAX_SYMBOLS], zerocount, ppmd_flags;
2059 unsigned int maxorder;
2060 struct huffman_code precode;
2061 struct rar *rar = (struct rar *)(a->format->data);
2062 struct rar_br *br = &(rar->br);
2066 /* Skip to the next byte */
2067 rar_br_consume_unalined_bits(br);
2069 /* PPMd block flag */
2070 if (!rar_br_read_ahead(a, br, 1))
2071 goto truncated_data;
2072 if ((rar->is_ppmd_block = rar_br_bits(br, 1)) != 0)
2074 rar_br_consume(br, 1);
2075 if (!rar_br_read_ahead(a, br, 7))
2076 goto truncated_data;
2077 ppmd_flags = rar_br_bits(br, 7);
2078 rar_br_consume(br, 7);
2080 /* Memory is allocated in MB */
2081 if (ppmd_flags & 0x20)
2083 if (!rar_br_read_ahead(a, br, 8))
2084 goto truncated_data;
2085 rar->dictionary_size = (rar_br_bits(br, 8) + 1) << 20;
2086 rar_br_consume(br, 8);
2089 if (ppmd_flags & 0x40)
2091 if (!rar_br_read_ahead(a, br, 8))
2092 goto truncated_data;
2093 rar->ppmd_escape = rar->ppmd7_context.InitEsc = rar_br_bits(br, 8);
2094 rar_br_consume(br, 8);
2097 rar->ppmd_escape = 2;
2099 if (ppmd_flags & 0x20)
2101 maxorder = (ppmd_flags & 0x1F) + 1;
2103 maxorder = 16 + (maxorder - 16) * 3;
2107 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2108 "Truncated RAR file data");
2109 return (ARCHIVE_FATAL);
2112 /* Make sure ppmd7_contest is freed before Ppmd7_Construct
2113 * because reading a broken file cause this abnormal sequence. */
2114 __archive_ppmd7_functions.Ppmd7_Free(&rar->ppmd7_context);
2117 rar->bytein.Read = &ppmd_read;
2118 __archive_ppmd7_functions.PpmdRAR_RangeDec_CreateVTable(&rar->range_dec);
2119 rar->range_dec.Stream = &rar->bytein;
2120 __archive_ppmd7_functions.Ppmd7_Construct(&rar->ppmd7_context);
2122 if (rar->dictionary_size == 0) {
2123 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2124 "Invalid zero dictionary size");
2125 return (ARCHIVE_FATAL);
2128 if (!__archive_ppmd7_functions.Ppmd7_Alloc(&rar->ppmd7_context,
2129 rar->dictionary_size))
2131 archive_set_error(&a->archive, ENOMEM,
2133 return (ARCHIVE_FATAL);
2135 if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
2137 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2138 "Unable to initialize PPMd range decoder");
2139 return (ARCHIVE_FATAL);
2141 __archive_ppmd7_functions.Ppmd7_Init(&rar->ppmd7_context, maxorder);
2142 rar->ppmd_valid = 1;
2146 if (!rar->ppmd_valid) {
2147 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2148 "Invalid PPMd sequence");
2149 return (ARCHIVE_FATAL);
2151 if (!__archive_ppmd7_functions.PpmdRAR_RangeDec_Init(&rar->range_dec))
2153 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2154 "Unable to initialize PPMd range decoder");
2155 return (ARCHIVE_FATAL);
2161 rar_br_consume(br, 1);
2163 /* Keep existing table flag */
2164 if (!rar_br_read_ahead(a, br, 1))
2165 goto truncated_data;
2166 if (!rar_br_bits(br, 1))
2167 memset(rar->lengthtable, 0, sizeof(rar->lengthtable));
2168 rar_br_consume(br, 1);
2170 memset(&bitlengths, 0, sizeof(bitlengths));
2171 for (i = 0; i < MAX_SYMBOLS;)
2173 if (!rar_br_read_ahead(a, br, 4))
2174 goto truncated_data;
2175 bitlengths[i++] = rar_br_bits(br, 4);
2176 rar_br_consume(br, 4);
2177 if (bitlengths[i-1] == 0xF)
2179 if (!rar_br_read_ahead(a, br, 4))
2180 goto truncated_data;
2181 zerocount = rar_br_bits(br, 4);
2182 rar_br_consume(br, 4);
2186 for (j = 0; j < zerocount + 2 && i < MAX_SYMBOLS; j++)
2187 bitlengths[i++] = 0;
2192 memset(&precode, 0, sizeof(precode));
2193 r = create_code(a, &precode, bitlengths, MAX_SYMBOLS, MAX_SYMBOL_LENGTH);
2194 if (r != ARCHIVE_OK) {
2196 free(precode.table);
2200 for (i = 0; i < HUFFMAN_TABLE_SIZE;)
2202 if ((val = read_next_symbol(a, &precode)) < 0) {
2204 free(precode.table);
2205 return (ARCHIVE_FATAL);
2209 rar->lengthtable[i] = (rar->lengthtable[i] + val) & 0xF;
2217 free(precode.table);
2218 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2219 "Internal error extracting RAR file.");
2220 return (ARCHIVE_FATAL);
2224 if (!rar_br_read_ahead(a, br, 3)) {
2226 free(precode.table);
2227 goto truncated_data;
2229 n = rar_br_bits(br, 3) + 3;
2230 rar_br_consume(br, 3);
2232 if (!rar_br_read_ahead(a, br, 7)) {
2234 free(precode.table);
2235 goto truncated_data;
2237 n = rar_br_bits(br, 7) + 11;
2238 rar_br_consume(br, 7);
2241 for (j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
2243 rar->lengthtable[i] = rar->lengthtable[i-1];
2250 if (!rar_br_read_ahead(a, br, 3)) {
2252 free(precode.table);
2253 goto truncated_data;
2255 n = rar_br_bits(br, 3) + 3;
2256 rar_br_consume(br, 3);
2258 if (!rar_br_read_ahead(a, br, 7)) {
2260 free(precode.table);
2261 goto truncated_data;
2263 n = rar_br_bits(br, 7) + 11;
2264 rar_br_consume(br, 7);
2267 for(j = 0; j < n && i < HUFFMAN_TABLE_SIZE; j++)
2268 rar->lengthtable[i++] = 0;
2272 free(precode.table);
2274 r = create_code(a, &rar->maincode, &rar->lengthtable[0], MAINCODE_SIZE,
2276 if (r != ARCHIVE_OK)
2278 r = create_code(a, &rar->offsetcode, &rar->lengthtable[MAINCODE_SIZE],
2279 OFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
2280 if (r != ARCHIVE_OK)
2282 r = create_code(a, &rar->lowoffsetcode,
2283 &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE],
2284 LOWOFFSETCODE_SIZE, MAX_SYMBOL_LENGTH);
2285 if (r != ARCHIVE_OK)
2287 r = create_code(a, &rar->lengthcode,
2288 &rar->lengthtable[MAINCODE_SIZE + OFFSETCODE_SIZE +
2289 LOWOFFSETCODE_SIZE], LENGTHCODE_SIZE, MAX_SYMBOL_LENGTH);
2290 if (r != ARCHIVE_OK)
2294 if (!rar->dictionary_size || !rar->lzss.window)
2296 /* Seems as though dictionary sizes are not used. Even so, minimize
2297 * memory usage as much as possible.
2300 unsigned int new_size;
2302 if (rar->unp_size >= DICTIONARY_MAX_SIZE)
2303 new_size = DICTIONARY_MAX_SIZE;
2305 new_size = rar_fls((unsigned int)rar->unp_size) << 1;
2306 new_window = realloc(rar->lzss.window, new_size);
2307 if (new_window == NULL) {
2308 archive_set_error(&a->archive, ENOMEM,
2309 "Unable to allocate memory for uncompressed data.");
2310 return (ARCHIVE_FATAL);
2312 rar->lzss.window = (unsigned char *)new_window;
2313 rar->dictionary_size = new_size;
2314 memset(rar->lzss.window, 0, rar->dictionary_size);
2315 rar->lzss.mask = rar->dictionary_size - 1;
2318 rar->start_new_table = 0;
2319 return (ARCHIVE_OK);
2321 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2322 "Truncated RAR file data");
2324 return (ARCHIVE_FATAL);
2328 free_codes(struct archive_read *a)
2330 struct rar *rar = (struct rar *)(a->format->data);
2331 free(rar->maincode.tree);
2332 free(rar->offsetcode.tree);
2333 free(rar->lowoffsetcode.tree);
2334 free(rar->lengthcode.tree);
2335 free(rar->maincode.table);
2336 free(rar->offsetcode.table);
2337 free(rar->lowoffsetcode.table);
2338 free(rar->lengthcode.table);
2339 memset(&rar->maincode, 0, sizeof(rar->maincode));
2340 memset(&rar->offsetcode, 0, sizeof(rar->offsetcode));
2341 memset(&rar->lowoffsetcode, 0, sizeof(rar->lowoffsetcode));
2342 memset(&rar->lengthcode, 0, sizeof(rar->lengthcode));
2347 read_next_symbol(struct archive_read *a, struct huffman_code *code)
2351 int length, value, node;
2357 if (make_table(a, code) != (ARCHIVE_OK))
2361 rar = (struct rar *)(a->format->data);
2364 /* Look ahead (peek) at bits */
2365 if (!rar_br_read_ahead(a, br, code->tablesize)) {
2366 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2367 "Truncated RAR file data");
2371 bits = rar_br_bits(br, code->tablesize);
2373 length = code->table[bits].length;
2374 value = code->table[bits].value;
2378 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2379 "Invalid prefix code in bitstream");
2383 if (length <= code->tablesize)
2385 /* Skip length bits */
2386 rar_br_consume(br, length);
2390 /* Skip tablesize bits */
2391 rar_br_consume(br, code->tablesize);
2394 while (!(code->tree[node].branches[0] ==
2395 code->tree[node].branches[1]))
2397 if (!rar_br_read_ahead(a, br, 1)) {
2398 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2399 "Truncated RAR file data");
2403 bit = rar_br_bits(br, 1);
2404 rar_br_consume(br, 1);
2406 if (code->tree[node].branches[bit] < 0)
2408 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2409 "Invalid prefix code in bitstream");
2412 node = code->tree[node].branches[bit];
2415 return code->tree[node].branches[0];
2419 create_code(struct archive_read *a, struct huffman_code *code,
2420 unsigned char *lengths, int numsymbols, char maxlength)
2422 int i, j, codebits = 0, symbolsleft = numsymbols;
2424 code->numentries = 0;
2425 code->numallocatedentries = 0;
2426 if (new_node(code) < 0) {
2427 archive_set_error(&a->archive, ENOMEM,
2428 "Unable to allocate memory for node data.");
2429 return (ARCHIVE_FATAL);
2431 code->numentries = 1;
2432 code->minlength = INT_MAX;
2433 code->maxlength = INT_MIN;
2435 for(i = 1; i <= maxlength; i++)
2437 for(j = 0; j < numsymbols; j++)
2439 if (lengths[j] != i) continue;
2440 if (add_value(a, code, j, codebits, i) != ARCHIVE_OK)
2441 return (ARCHIVE_FATAL);
2443 if (--symbolsleft <= 0) { break; break; }
2447 return (ARCHIVE_OK);
2451 add_value(struct archive_read *a, struct huffman_code *code, int value,
2452 int codebits, int length)
2454 int repeatpos, lastnode, bitpos, bit, repeatnode, nextnode;
2459 if(length > code->maxlength)
2460 code->maxlength = length;
2461 if(length < code->minlength)
2462 code->minlength = length;
2465 if (repeatpos == 0 || (repeatpos >= 0
2466 && (((codebits >> (repeatpos - 1)) & 3) == 0
2467 || ((codebits >> (repeatpos - 1)) & 3) == 3)))
2469 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2470 "Invalid repeat position");
2471 return (ARCHIVE_FATAL);
2475 for (bitpos = length - 1; bitpos >= 0; bitpos--)
2477 bit = (codebits >> bitpos) & 1;
2479 /* Leaf node check */
2480 if (code->tree[lastnode].branches[0] ==
2481 code->tree[lastnode].branches[1])
2483 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2485 return (ARCHIVE_FATAL);
2488 if (bitpos == repeatpos)
2490 /* Open branch check */
2491 if (!(code->tree[lastnode].branches[bit] < 0))
2493 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2494 "Invalid repeating code");
2495 return (ARCHIVE_FATAL);
2498 if ((repeatnode = new_node(code)) < 0) {
2499 archive_set_error(&a->archive, ENOMEM,
2500 "Unable to allocate memory for node data.");
2501 return (ARCHIVE_FATAL);
2503 if ((nextnode = new_node(code)) < 0) {
2504 archive_set_error(&a->archive, ENOMEM,
2505 "Unable to allocate memory for node data.");
2506 return (ARCHIVE_FATAL);
2510 code->tree[lastnode].branches[bit] = repeatnode;
2511 code->tree[repeatnode].branches[bit] = repeatnode;
2512 code->tree[repeatnode].branches[bit^1] = nextnode;
2513 lastnode = nextnode;
2515 bitpos++; /* terminating bit already handled, skip it */
2519 /* Open branch check */
2520 if (code->tree[lastnode].branches[bit] < 0)
2522 if (new_node(code) < 0) {
2523 archive_set_error(&a->archive, ENOMEM,
2524 "Unable to allocate memory for node data.");
2525 return (ARCHIVE_FATAL);
2527 code->tree[lastnode].branches[bit] = code->numentries++;
2531 lastnode = code->tree[lastnode].branches[bit];
2535 if (!(code->tree[lastnode].branches[0] == -1
2536 && code->tree[lastnode].branches[1] == -2))
2538 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2540 return (ARCHIVE_FATAL);
2543 /* Set leaf value */
2544 code->tree[lastnode].branches[0] = value;
2545 code->tree[lastnode].branches[1] = value;
2547 return (ARCHIVE_OK);
2551 new_node(struct huffman_code *code)
2554 if (code->numallocatedentries == code->numentries) {
2555 int new_num_entries = 256;
2556 if (code->numentries > 0) {
2557 new_num_entries = code->numentries * 2;
2559 new_tree = realloc(code->tree, new_num_entries * sizeof(*code->tree));
2560 if (new_tree == NULL)
2562 code->tree = (struct huffman_tree_node *)new_tree;
2563 code->numallocatedentries = new_num_entries;
2565 code->tree[code->numentries].branches[0] = -1;
2566 code->tree[code->numentries].branches[1] = -2;
2571 make_table(struct archive_read *a, struct huffman_code *code)
2573 if (code->maxlength < code->minlength || code->maxlength > 10)
2574 code->tablesize = 10;
2576 code->tablesize = code->maxlength;
2579 (struct huffman_table_entry *)calloc(1, sizeof(*code->table)
2580 * ((size_t)1 << code->tablesize));
2582 return make_table_recurse(a, code, 0, code->table, 0, code->tablesize);
2586 make_table_recurse(struct archive_read *a, struct huffman_code *code, int node,
2587 struct huffman_table_entry *table, int depth,
2590 int currtablesize, i, ret = (ARCHIVE_OK);
2594 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2595 "Huffman tree was not created.");
2596 return (ARCHIVE_FATAL);
2598 if (node < 0 || node >= code->numentries)
2600 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2601 "Invalid location to Huffman tree specified.");
2602 return (ARCHIVE_FATAL);
2605 currtablesize = 1 << (maxdepth - depth);
2607 if (code->tree[node].branches[0] ==
2608 code->tree[node].branches[1])
2610 for(i = 0; i < currtablesize; i++)
2612 table[i].length = depth;
2613 table[i].value = code->tree[node].branches[0];
2618 for(i = 0; i < currtablesize; i++)
2619 table[i].length = -1;
2623 if(depth == maxdepth)
2625 table[0].length = maxdepth + 1;
2626 table[0].value = node;
2630 ret |= make_table_recurse(a, code, code->tree[node].branches[0], table,
2631 depth + 1, maxdepth);
2632 ret |= make_table_recurse(a, code, code->tree[node].branches[1],
2633 table + currtablesize / 2, depth + 1, maxdepth);
2640 expand(struct archive_read *a, int64_t end)
2642 static const unsigned char lengthbases[] =
2643 { 0, 1, 2, 3, 4, 5, 6,
2644 7, 8, 10, 12, 14, 16, 20,
2645 24, 28, 32, 40, 48, 56, 64,
2646 80, 96, 112, 128, 160, 192, 224 };
2647 static const unsigned char lengthbits[] =
2648 { 0, 0, 0, 0, 0, 0, 0,
2649 0, 1, 1, 1, 1, 2, 2,
2650 2, 2, 3, 3, 3, 3, 4,
2651 4, 4, 4, 5, 5, 5, 5 };
2652 static const unsigned int offsetbases[] =
2654 8, 12, 16, 24, 32, 48,
2655 64, 96, 128, 192, 256, 384,
2656 512, 768, 1024, 1536, 2048, 3072,
2657 4096, 6144, 8192, 12288, 16384, 24576,
2658 32768, 49152, 65536, 98304, 131072, 196608,
2659 262144, 327680, 393216, 458752, 524288, 589824,
2660 655360, 720896, 786432, 851968, 917504, 983040,
2661 1048576, 1310720, 1572864, 1835008, 2097152, 2359296,
2662 2621440, 2883584, 3145728, 3407872, 3670016, 3932160 };
2663 static const unsigned char offsetbits[] =
2664 { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
2665 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10,
2666 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16,
2667 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
2668 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 };
2669 static const unsigned char shortbases[] =
2670 { 0, 4, 8, 16, 32, 64, 128, 192 };
2671 static const unsigned char shortbits[] =
2672 { 2, 2, 3, 4, 5, 6, 6, 6 };
2674 int symbol, offs, len, offsindex, lensymbol, i, offssymbol, lowoffsetsymbol;
2675 unsigned char newfile;
2676 struct rar *rar = (struct rar *)(a->format->data);
2677 struct rar_br *br = &(rar->br);
2679 if (rar->filterstart < end)
2680 end = rar->filterstart;
2684 if (rar->output_last_match &&
2685 lzss_position(&rar->lzss) + rar->lastlength <= end)
2687 lzss_emit_match(rar, rar->lastoffset, rar->lastlength);
2688 rar->output_last_match = 0;
2691 if(rar->is_ppmd_block || rar->output_last_match ||
2692 lzss_position(&rar->lzss) >= end)
2693 return lzss_position(&rar->lzss);
2695 if ((symbol = read_next_symbol(a, &rar->maincode)) < 0)
2696 return (ARCHIVE_FATAL);
2697 rar->output_last_match = 0;
2701 lzss_emit_literal(rar, symbol);
2704 else if (symbol == 256)
2706 if (!rar_br_read_ahead(a, br, 1))
2707 goto truncated_data;
2708 newfile = !rar_br_bits(br, 1);
2709 rar_br_consume(br, 1);
2713 rar->start_new_block = 1;
2714 if (!rar_br_read_ahead(a, br, 1))
2715 goto truncated_data;
2716 rar->start_new_table = rar_br_bits(br, 1);
2717 rar_br_consume(br, 1);
2718 return lzss_position(&rar->lzss);
2722 if (parse_codes(a) != ARCHIVE_OK)
2723 return (ARCHIVE_FATAL);
2727 else if(symbol==257)
2729 archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
2730 "Parsing filters is unsupported.");
2731 return (ARCHIVE_FAILED);
2733 else if(symbol==258)
2735 if(rar->lastlength == 0)
2738 offs = rar->lastoffset;
2739 len = rar->lastlength;
2741 else if (symbol <= 262)
2743 offsindex = symbol - 259;
2744 offs = rar->oldoffset[offsindex];
2746 if ((lensymbol = read_next_symbol(a, &rar->lengthcode)) < 0)
2748 if (lensymbol > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
2750 if (lensymbol > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
2752 len = lengthbases[lensymbol] + 2;
2753 if (lengthbits[lensymbol] > 0) {
2754 if (!rar_br_read_ahead(a, br, lengthbits[lensymbol]))
2755 goto truncated_data;
2756 len += rar_br_bits(br, lengthbits[lensymbol]);
2757 rar_br_consume(br, lengthbits[lensymbol]);
2760 for (i = offsindex; i > 0; i--)
2761 rar->oldoffset[i] = rar->oldoffset[i-1];
2762 rar->oldoffset[0] = offs;
2764 else if(symbol<=270)
2766 offs = shortbases[symbol-263] + 1;
2767 if(shortbits[symbol-263] > 0) {
2768 if (!rar_br_read_ahead(a, br, shortbits[symbol-263]))
2769 goto truncated_data;
2770 offs += rar_br_bits(br, shortbits[symbol-263]);
2771 rar_br_consume(br, shortbits[symbol-263]);
2776 for(i = 3; i > 0; i--)
2777 rar->oldoffset[i] = rar->oldoffset[i-1];
2778 rar->oldoffset[0] = offs;
2782 if (symbol-271 > (int)(sizeof(lengthbases)/sizeof(lengthbases[0])))
2784 if (symbol-271 > (int)(sizeof(lengthbits)/sizeof(lengthbits[0])))
2786 len = lengthbases[symbol-271]+3;
2787 if(lengthbits[symbol-271] > 0) {
2788 if (!rar_br_read_ahead(a, br, lengthbits[symbol-271]))
2789 goto truncated_data;
2790 len += rar_br_bits(br, lengthbits[symbol-271]);
2791 rar_br_consume(br, lengthbits[symbol-271]);
2794 if ((offssymbol = read_next_symbol(a, &rar->offsetcode)) < 0)
2796 if (offssymbol > (int)(sizeof(offsetbases)/sizeof(offsetbases[0])))
2798 if (offssymbol > (int)(sizeof(offsetbits)/sizeof(offsetbits[0])))
2800 offs = offsetbases[offssymbol]+1;
2801 if(offsetbits[offssymbol] > 0)
2805 if(offsetbits[offssymbol] > 4) {
2806 if (!rar_br_read_ahead(a, br, offsetbits[offssymbol] - 4))
2807 goto truncated_data;
2808 offs += rar_br_bits(br, offsetbits[offssymbol] - 4) << 4;
2809 rar_br_consume(br, offsetbits[offssymbol] - 4);
2812 if(rar->numlowoffsetrepeats > 0)
2814 rar->numlowoffsetrepeats--;
2815 offs += rar->lastlowoffset;
2819 if ((lowoffsetsymbol =
2820 read_next_symbol(a, &rar->lowoffsetcode)) < 0)
2821 return (ARCHIVE_FATAL);
2822 if(lowoffsetsymbol == 16)
2824 rar->numlowoffsetrepeats = 15;
2825 offs += rar->lastlowoffset;
2829 offs += lowoffsetsymbol;
2830 rar->lastlowoffset = lowoffsetsymbol;
2835 if (!rar_br_read_ahead(a, br, offsetbits[offssymbol]))
2836 goto truncated_data;
2837 offs += rar_br_bits(br, offsetbits[offssymbol]);
2838 rar_br_consume(br, offsetbits[offssymbol]);
2842 if (offs >= 0x40000)
2847 for(i = 3; i > 0; i--)
2848 rar->oldoffset[i] = rar->oldoffset[i-1];
2849 rar->oldoffset[0] = offs;
2852 rar->lastoffset = offs;
2853 rar->lastlength = len;
2854 rar->output_last_match = 1;
2857 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2858 "Truncated RAR file data");
2860 return (ARCHIVE_FATAL);
2862 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2863 "Bad RAR file data");
2864 return (ARCHIVE_FATAL);
2868 copy_from_lzss_window(struct archive_read *a, const void **buffer,
2869 int64_t startpos, int length)
2871 int windowoffs, firstpart;
2872 struct rar *rar = (struct rar *)(a->format->data);
2874 if (!rar->unp_buffer)
2876 if ((rar->unp_buffer = malloc(rar->unp_buffer_size)) == NULL)
2878 archive_set_error(&a->archive, ENOMEM,
2879 "Unable to allocate memory for uncompressed data.");
2880 return (ARCHIVE_FATAL);
2884 windowoffs = lzss_offset_for_position(&rar->lzss, startpos);
2885 if(windowoffs + length <= lzss_size(&rar->lzss)) {
2886 memcpy(&rar->unp_buffer[rar->unp_offset], &rar->lzss.window[windowoffs],
2888 } else if (length <= lzss_size(&rar->lzss)) {
2889 firstpart = lzss_size(&rar->lzss) - windowoffs;
2890 if (firstpart < 0) {
2891 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2892 "Bad RAR file data");
2893 return (ARCHIVE_FATAL);
2895 if (firstpart < length) {
2896 memcpy(&rar->unp_buffer[rar->unp_offset],
2897 &rar->lzss.window[windowoffs], firstpart);
2898 memcpy(&rar->unp_buffer[rar->unp_offset + firstpart],
2899 &rar->lzss.window[0], length - firstpart);
2901 memcpy(&rar->unp_buffer[rar->unp_offset],
2902 &rar->lzss.window[windowoffs], length);
2905 archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,
2906 "Bad RAR file data");
2907 return (ARCHIVE_FATAL);
2909 rar->unp_offset += length;
2910 if (rar->unp_offset >= rar->unp_buffer_size)
2911 *buffer = rar->unp_buffer;
2914 return (ARCHIVE_OK);
2918 rar_read_ahead(struct archive_read *a, size_t min, ssize_t *avail)
2920 struct rar *rar = (struct rar *)(a->format->data);
2921 const void *h = __archive_read_ahead(a, min, avail);
2925 if (a->archive.read_data_is_posix_read && *avail > (ssize_t)a->archive.read_data_requested)
2926 *avail = a->archive.read_data_requested;
2927 if (*avail > rar->bytes_remaining)
2928 *avail = (ssize_t)rar->bytes_remaining;
2931 else if (*avail == 0 && rar->main_flags & MHD_VOLUME &&
2932 rar->file_flags & FHD_SPLIT_AFTER)
2934 ret = archive_read_format_rar_read_header(a, a->entry);
2935 if (ret == (ARCHIVE_EOF))
2937 rar->has_endarc_header = 1;
2938 ret = archive_read_format_rar_read_header(a, a->entry);
2940 if (ret != (ARCHIVE_OK))
2942 return rar_read_ahead(a, min, avail);