From 3cc6e071748722c5c7caeb11a3fa14f979c86a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Sun, 5 Jul 2015 10:23:21 -0300 Subject: [PATCH] (task_database) Fix leaks when scanning zip files --- libretro-common/file/file_extract.c | 13 +++++++++++++ libretro-common/include/file/file_extract.h | 2 ++ tasks/task_database.c | 3 +++ 3 files changed, 18 insertions(+) diff --git a/libretro-common/file/file_extract.c b/libretro-common/file/file_extract.c index 083e19b99e..f682b6dfab 100644 --- a/libretro-common/file/file_extract.c +++ b/libretro-common/file/file_extract.c @@ -617,7 +617,10 @@ int zlib_parse_file_iterate(void *data, bool *returnerr, const char *file, *returnerr = false; case ZLIB_TRANSFER_DEINIT: if (state->handle) + { state->backend->free(state->handle); + state->handle = NULL; + } break; } @@ -628,6 +631,16 @@ int zlib_parse_file_iterate(void *data, bool *returnerr, const char *file, return 0; } +void zlib_parse_file_iterate_stop(void *data) +{ + zlib_transfer_t *state = (zlib_transfer_t*)data; + if (!state || !state->handle) + return; + + state->type = ZLIB_TRANSFER_DEINIT; + zlib_parse_file_iterate(data, NULL, NULL, NULL, NULL, NULL); +} + /** * zlib_parse_file: * @file : filename path of archive diff --git a/libretro-common/include/file/file_extract.h b/libretro-common/include/file/file_extract.h index 7e16ff5e36..388592346f 100644 --- a/libretro-common/include/file/file_extract.h +++ b/libretro-common/include/file/file_extract.h @@ -83,6 +83,8 @@ int zlib_parse_file_iterate(void *data, bool *returnerr, const char *file, const char *valid_exts, zlib_file_cb file_cb, void *userdata); +void zlib_parse_file_iterate_stop(void *data); + /** * zlib_extract_first_content_file: * @zip_path : filename path to ZIP archive. diff --git a/tasks/task_database.c b/tasks/task_database.c index 5a07c78e92..c2b8ad43be 100644 --- a/tasks/task_database.c +++ b/tasks/task_database.c @@ -279,7 +279,10 @@ static int database_info_iterate_playlist_zip( bool returnerr = true; #ifdef HAVE_ZLIB if (db_state->crc != 0) + { + zlib_parse_file_iterate_stop(&db->state); return database_info_iterate_crc_lookup(db_state, db, db_state->zip_name); + } else { if (zlib_parse_file_iterate(&db->state,