Merge pull request #2893 from antekone/feature/github/1963/init-twice/1

RAR5 reader: fix SIGSEGV when archive_read_support_format_rar5 is called twice

(cherry picked from commit 5a1f39d8f3)
This commit is contained in:
Tim Kientzle authored and Martin Matuska committed 2026-03-10 09:31:13 +01:00
1 parent 5bb5988601
commit 939bbe39c0
1 file changed
+11 -3
+11 -3
View File
@@ -375,6 +375,7 @@ static int rar5_read_data_skip(struct archive_read *a);
static int push_data_ready(struct archive_read* a, struct rar5* rar,
const uint8_t* buf, size_t size, int64_t offset);
static void clear_data_ready_stack(struct rar5* rar);
static void rar5_deinit(struct rar5* rar);
/* CDE_xxx = Circular Double Ended (Queue) return values. */
enum CDE_RETURN_VALUES {
@@ -4328,7 +4329,7 @@ static int rar5_cleanup(struct archive_read *a) {
free(rar->vol.push_buf);
free_filters(rar);
cdeque_free(&rar->cstate.filters);
rar5_deinit(rar);
free(rar);
a->format->data = NULL;
@@ -4353,6 +4354,7 @@ static int rar5_has_encrypted_entries(struct archive_read *_a) {
return ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW;
}
/* Must match deallocations in rar5_deinit */
static int rar5_init(struct rar5* rar) {
memset(rar, 0, sizeof(struct rar5));
@@ -4368,6 +4370,11 @@ static int rar5_init(struct rar5* rar) {
return ARCHIVE_OK;
}
/* Must match allocations in rar5_init */
static void rar5_deinit(struct rar5* rar) {
cdeque_free(&rar->cstate.filters);
}
int archive_read_support_format_rar5(struct archive *_a) {
struct archive_read* ar;
int ret;
@@ -4404,8 +4411,9 @@ int archive_read_support_format_rar5(struct archive *_a) {
rar5_has_encrypted_entries);
if(ret != ARCHIVE_OK) {
(void) rar5_cleanup(ar);
rar5_deinit(rar);
free(rar);
}
return ret;
return ARCHIVE_OK;
}