From 42971febba50bb4f750caaec1fce33572f504201 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 24 May 2016 22:01:43 +0200 Subject: [PATCH] Fix resource leaks (pointed out by Coverity) --- cheevos.c | 7 +++++-- gfx/drivers_shader/shader_glsl.c | 2 ++ gfx/video_state_python.c | 1 + libretro-common/formats/png/rpng.c | 3 +++ libretro-db/libretrodb.c | 1 + managers/cheat_manager.c | 11 ++++++----- patch.c | 3 +++ tasks/task_database_cue.c | 7 +++++++ tasks/task_save_state.c | 1 + 9 files changed, 29 insertions(+), 7 deletions(-) diff --git a/cheevos.c b/cheevos.c index 554d1e6f86..3be5eb9dc3 100644 --- a/cheevos.c +++ b/cheevos.c @@ -1999,11 +1999,14 @@ static unsigned cheevos_find_game_id_nes( filestream_seek(file, sizeof(header), SEEK_CUR); bytes = (round) ? rom_size : header.rom_size; - num_read = filestream_read(file, (void*) data, 0x4000 * bytes ); + num_read = filestream_read(file, (void*)data, 0x4000 * bytes ); filestream_close(file); if (num_read <= 0) - return 0; + { + free(data); + return 0; + } MD5_Update(&ctx, (void*) data, rom_size << 14); MD5_Final(hash, &ctx); diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 2d7a95c8c2..07be78dd6d 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -942,6 +942,8 @@ static void *gl_glsl_init(void *data, const char *path) error: gl_glsl_destroy_resources(glsl); + if (conf) + config_file_free(conf); if (glsl) free(glsl); diff --git a/gfx/video_state_python.c b/gfx/video_state_python.c index 08c2d0dc67..ae678b03a3 100644 --- a/gfx/video_state_python.c +++ b/gfx/video_state_python.c @@ -310,6 +310,7 @@ py_state_t *py_state_new(const char *script, if (!ret || len < 0) { RARCH_ERR("Python: Failed to read script\n"); + free(script_); goto error; } diff --git a/libretro-common/formats/png/rpng.c b/libretro-common/formats/png/rpng.c index e7c233958d..20fb1f687c 100644 --- a/libretro-common/formats/png/rpng.c +++ b/libretro-common/formats/png/rpng.c @@ -786,7 +786,10 @@ static struct rpng_process *rpng_process_init(rpng_t *rpng, unsigned *width, uns return NULL; if (!process->stream_backend->stream_decompress_init(process->stream)) + { + free(process); return NULL; + } inflate_buf = (uint8_t*)malloc(process->inflate_buf_size); if (!inflate_buf) diff --git a/libretro-db/libretrodb.c b/libretro-db/libretrodb.c index 50750ddbcd..c34da06d40 100644 --- a/libretro-db/libretrodb.c +++ b/libretro-db/libretrodb.c @@ -565,6 +565,7 @@ clean: free(buff); if (cur.is_valid) libretrodb_cursor_close(&cur); + bintree_free(tree); return 0; } diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index a3ddeaebc6..eb3da59741 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -221,15 +221,12 @@ bool cheat_manager_load(const char *path) config_get_uint(conf, "cheats", &cheats); if (cheats == 0) - return false; + goto error; cheat = cheat_manager_new(cheats); if (!cheat) - { - config_file_free(conf); - return false; - } + goto error; for (i = 0; i < cheats; i++) { @@ -263,6 +260,10 @@ bool cheat_manager_load(const char *path) cheat_manager_state = cheat; return true; + +error: + config_file_free(conf); + return false; } diff --git a/patch.c b/patch.c index a5d7e44183..809ecbf5d3 100644 --- a/patch.c +++ b/patch.c @@ -523,7 +523,10 @@ static bool apply_patch_content(uint8_t **buf, return false; if (!path_file_exists(patch_path)) + { + free(patch_data); return false; + } RARCH_LOG("Found %s file in \"%s\", attempting to patch ...\n", patch_desc, patch_path); diff --git a/tasks/task_database_cue.c b/tasks/task_database_cue.c index 463e92bd7a..4aca11f407 100644 --- a/tasks/task_database_cue.c +++ b/tasks/task_database_cue.c @@ -128,7 +128,10 @@ static int find_token(RFILE *fd, const char *token) while (strncmp(tmp_token, token, tmp_len) != 0) { if (get_token(fd, tmp_token, tmp_len) <= 0) + { + free(tmp_token); return -1; + } } free(tmp_token); @@ -180,7 +183,10 @@ static int detect_ps1_game_sub(const char *track_path, return 0; if (!strncasecmp((const char*)(tmp + 33), "SYSTEM.CNF;1", 12)) + { + filestream_close(fp); break; + } tmp += *tmp; } @@ -389,6 +395,7 @@ int find_first_data_track(const char *cue_path, if (sscanf(tmp_token, "%02d:%02d:%02d", &m, &s, &f) < 3) { RARCH_LOG("Error parsing time stamp '%s'\n", tmp_token); + filestream_close(fd); return -errno; } diff --git a/tasks/task_save_state.c b/tasks/task_save_state.c index f0b062771f..4c355797fb 100644 --- a/tasks/task_save_state.c +++ b/tasks/task_save_state.c @@ -206,5 +206,6 @@ error: RARCH_ERR("%s \"%s\".\n", msg_hash_to_str(MSG_FAILED_TO_LOAD_STATE), path); + free(buf); return false; }