|
| 1 | +From ec6707deeda82a585bac6ec2b8d64a8a5924c985 Mon Sep 17 00:00:00 2001 |
| 2 | +From: elhananhaenel <elhanan.haenel@mail.huji.ac.il> |
| 3 | +Date: Sat, 7 Mar 2026 22:32:09 +0200 |
| 4 | +Subject: [PATCH 1/2] rar: fix LZSS window size mismatch after PPMd block |
| 5 | + |
| 6 | +When a PPMd-compressed block updates dictionary_size, the LZSS window |
| 7 | +from a prior block is not reallocated. The allocation guard only checks |
| 8 | +if dictionary_size is zero or the window pointer is NULL, not whether |
| 9 | +the existing window is large enough. This allows copy_from_lzss_window() |
| 10 | +to read past the allocated buffer. |
| 11 | + |
| 12 | +Fix the guard to also check whether the current window is undersized. |
| 13 | +Add bounds checks in copy_from_lzss_window() and parse_filter() as |
| 14 | +defense in depth. |
| 15 | +--- |
| 16 | + libarchive/archive_read_support_format_rar.c | 11 +++++++++-- |
| 17 | + 1 file changed, 9 insertions(+), 2 deletions(-) |
| 18 | + |
| 19 | +diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c |
| 20 | +index bb06f76..bc3f7d7 100644 |
| 21 | +--- a/libarchive/archive_read_support_format_rar.c |
| 22 | ++++ b/libarchive/archive_read_support_format_rar.c |
| 23 | +@@ -2503,7 +2503,8 @@ parse_codes(struct archive_read *a) |
| 24 | + return (r); |
| 25 | + } |
| 26 | + |
| 27 | +- if (!rar->dictionary_size || !rar->lzss.window) |
| 28 | ++ if (!rar->dictionary_size || !rar->lzss.window || |
| 29 | ++ (rar->lzss.mask + 1) < rar->dictionary_size) |
| 30 | + { |
| 31 | + /* Seems as though dictionary sizes are not used. Even so, minimize |
| 32 | + * memory usage as much as possible. |
| 33 | +@@ -3104,6 +3105,11 @@ copy_from_lzss_window(struct archive_read *a, uint8_t *buffer, |
| 34 | + |
| 35 | + windowoffs = lzss_offset_for_position(&rar->lzss, startpos); |
| 36 | + firstpart = lzss_size(&rar->lzss) - windowoffs; |
| 37 | ++ if (length > lzss_size(&rar->lzss)) { |
| 38 | ++ archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, |
| 39 | ++ "Bad RAR file data"); |
| 40 | ++ return (ARCHIVE_FATAL); |
| 41 | ++ } |
| 42 | + if (firstpart < 0) { |
| 43 | + archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, |
| 44 | + "Bad RAR file data"); |
| 45 | +@@ -3266,7 +3272,8 @@ parse_filter(struct archive_read *a, const uint8_t *bytes, uint16_t length, uint |
| 46 | + else |
| 47 | + blocklength = prog ? prog->oldfilterlength : 0; |
| 48 | + |
| 49 | +- if (blocklength > rar->dictionary_size) |
| 50 | ++ if (blocklength > rar->dictionary_size || |
| 51 | ++ blocklength > (uint32_t)(rar->lzss.mask + 1)) |
| 52 | + return 0; |
| 53 | + |
| 54 | + registers[3] = PROGRAM_SYSTEM_GLOBAL_ADDRESS; |
| 55 | +-- |
| 56 | +2.45.4 |
| 57 | + |
| 58 | + |
| 59 | +From 5fc14fd997dea3838ed49005b6e03241cb82f390 Mon Sep 17 00:00:00 2001 |
| 60 | +From: elhananhaenel <elhanan.haenel@mail.huji.ac.il> |
| 61 | +Date: Sun, 8 Mar 2026 15:29:46 +0200 |
| 62 | +Subject: [PATCH 2/2] Fix -Wsign-compare: cast mask+1 to unsigned int |
| 63 | + |
| 64 | +Signed-off-by: Azure Linux Security Servicing Account <azurelinux-security@microsoft.com> |
| 65 | +Upstream-reference: https://github.com/libarchive/libarchive/commit/762b30011a932c6ab988fd8664899a07eb6b7657.patch |
| 66 | +--- |
| 67 | + libarchive/archive_read_support_format_rar.c | 2 +- |
| 68 | + 1 file changed, 1 insertion(+), 1 deletion(-) |
| 69 | + |
| 70 | +diff --git a/libarchive/archive_read_support_format_rar.c b/libarchive/archive_read_support_format_rar.c |
| 71 | +index bc3f7d7..ee02cf9 100644 |
| 72 | +--- a/libarchive/archive_read_support_format_rar.c |
| 73 | ++++ b/libarchive/archive_read_support_format_rar.c |
| 74 | +@@ -2504,7 +2504,7 @@ parse_codes(struct archive_read *a) |
| 75 | + } |
| 76 | + |
| 77 | + if (!rar->dictionary_size || !rar->lzss.window || |
| 78 | +- (rar->lzss.mask + 1) < rar->dictionary_size) |
| 79 | ++ (unsigned int)(rar->lzss.mask + 1) < rar->dictionary_size) |
| 80 | + { |
| 81 | + /* Seems as though dictionary sizes are not used. Even so, minimize |
| 82 | + * memory usage as much as possible. |
| 83 | +-- |
| 84 | +2.45.4 |
| 85 | + |
0 commit comments