From: Michihiro NAKAJIMA Date: Sun, 7 Aug 2011 14:00:34 +0000 (-0400) Subject: Add a flag to check if PPMd is initialized in order not to cause X-Git-Tag: v3.0.0a~184 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df5a33cd1893acdeb48eeb1596c2a2e7a395dcf3;p=thirdparty%2Flibarchive.git Add a flag to check if PPMd is initialized in order not to cause a segmentation fault when reading a broken RAR file. SVN-Revision: 3551 --- diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c index 42e4f00d8..82d36f77c 100644 --- a/libarchive/archive_read_support_format_rar.c +++ b/libarchive/archive_read_support_format_rar.c @@ -238,6 +238,7 @@ struct rar char start_new_table; /* PPMd Variant H members */ + char ppmd_valid; char is_ppmd_block; int ppmd_escape; CPpmd7 ppmd7_context; @@ -1088,6 +1089,7 @@ read_header(struct archive_read *a, struct archive_entry *entry, rar->unp_buffer = NULL; memset(rar->lengthtable, 0, sizeof(rar->lengthtable)); Ppmd7_Free(&rar->ppmd7_context, &g_szalloc); + rar->ppmd_valid = 0; /* Don't set any archive entries for non-file header types */ if (head_type == NEWSUB_HEAD) @@ -1509,9 +1511,15 @@ parse_codes(struct archive_read *a) return (ARCHIVE_FATAL); } Ppmd7_Init(&rar->ppmd7_context, maxorder); + rar->ppmd_valid = 1; } else { + if (!rar->ppmd_valid) { + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, + "Invalid PPMd sequence"); + return (ARCHIVE_FAILED); + } if (!PpmdRAR_RangeDec_Init(&rar->range_dec)) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT,