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 {
free(rar->vol.push_buf);
free_filters(rar);
- cdeque_free(&rar->cstate.filters);
+ rar5_deinit(rar);
free(rar);
a->format->data = NULL;
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));
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;
rar5_has_encrypted_entries);
if(ret != ARCHIVE_OK) {
- (void) rar5_cleanup(ar);
+ rar5_deinit(rar);
+ free(rar);
}
- return ret;
+ return ARCHIVE_OK;
}