changeset 1592:31effaadf877

Fix some memory errors (mostly leaks) identified by valgrind
author Michael Pavone <pavone@retrodev.com>
date Fri, 22 Jun 2018 23:10:27 -0700
parents 5cfc7e4a207e
children 24508cb54f87
files blastem.c genesis.c m68k_core.c png.c romdb.c util.c z80_to_x86.c
diffstat 7 files changed, 31 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/blastem.c	Fri Jun 22 23:10:27 2018 -0700
@@ -259,7 +259,7 @@
 		//initial save dir was calculated based on lock-on cartridge because that's where the save device is
 		//save directory used for save states should still be located in the normal place
 		free(save_dir);
-		save_dir = get_save_dir(media);
+		parts[0] = save_dir = get_save_dir(media);
 	}
 	if (use_native_states || context->type != SYSTEM_GENESIS) {
 		parts[2] = "quicksave.state";
--- a/genesis.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/genesis.c	Fri Jun 22 23:10:27 2018 -0700
@@ -1301,7 +1301,6 @@
 	gen->psg = malloc(sizeof(psg_context));
 	psg_init(gen->psg, gen->master_clock, MCLKS_PER_PSG);
 
-	gen->zram = calloc(1, Z80_RAM_BYTES);
 	z80_map[0].buffer = gen->zram = calloc(1, Z80_RAM_BYTES);
 #ifndef NO_Z80
 	z80_options *z_opts = malloc(sizeof(z80_options));
--- a/m68k_core.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/m68k_core.c	Fri Jun 22 23:10:27 2018 -0700
@@ -1191,7 +1191,19 @@
 
 void m68k_options_free(m68k_options *opts)
 {
+	for (uint32_t address = 0; address < opts->gen.address_mask; address += NATIVE_CHUNK_SIZE)
+	{
+		uint32_t chunk = address / NATIVE_CHUNK_SIZE;
+		if (opts->gen.native_code_map[chunk].base) {
+			free(opts->gen.native_code_map[chunk].offsets);
+		}
+	}
 	free(opts->gen.native_code_map);
+	uint32_t ram_inst_slots = ram_size(&opts->gen) / 1024;
+	for (uint32_t i = 0; i < ram_inst_slots; i++)
+	{
+		free(opts->gen.ram_inst_sizes[i]);
+	}
 	free(opts->gen.ram_inst_sizes);
 	free(opts);
 }
--- a/png.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/png.c	Fri Jun 22 23:10:27 2018 -0700
@@ -430,6 +430,7 @@
 					}
 					last_line = line_start;
 				}
+				free(decomp_buffer);
 			} else {
 				//skip uncrecognized chunks
 				cur += 4 + chunk_size;
--- a/romdb.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/romdb.c	Fri Jun 22 23:10:27 2018 -0700
@@ -51,6 +51,8 @@
 		free(info->save_buffer);
 		if (info->save_type == SAVE_I2C) {
 			free(info->eeprom_map);
+		} else if (info->save_type == SAVE_NOR) {
+			free(info->nor);
 		}
 	}
 	free(info->map);
@@ -58,7 +60,6 @@
 	free(info->port2_override);
 	free(info->ext_override);
 	free(info->mouse_mode);
-	free(info->nor);
 }
 
 void cart_serialize(system_header *sys, serialize_buffer *buf)
--- a/util.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/util.c	Fri Jun 22 23:10:27 2018 -0700
@@ -359,9 +359,11 @@
 	for (extidx = 0; extidx < num_exts; extidx++)
 	{
 		if (!strcasecmp(ext, ext_list[extidx])) {
+			free(ext);
 			return 1;
 		}
 	}
+	free(ext);
 	return 0;
 }
 
@@ -721,6 +723,7 @@
 	if (numret) {
 		*numret = pos;
 	}
+	closedir(d);
 	return ret;
 }
 
--- a/z80_to_x86.c	Fri Jun 22 21:11:38 2018 -0700
+++ b/z80_to_x86.c	Fri Jun 22 23:10:27 2018 -0700
@@ -3671,7 +3671,19 @@
 
 void z80_options_free(z80_options *opts)
 {
+	for (uint32_t address = 0; address < opts->gen.address_mask; address += NATIVE_CHUNK_SIZE)
+	{
+		uint32_t chunk = address / NATIVE_CHUNK_SIZE;
+		if (opts->gen.native_code_map[chunk].base) {
+			free(opts->gen.native_code_map[chunk].offsets);
+		}
+	}
 	free(opts->gen.native_code_map);
+	uint32_t ram_inst_slots = ram_size(&opts->gen) / 1024;
+	for (uint32_t i = 0; i < ram_inst_slots; i++)
+	{
+		free(opts->gen.ram_inst_sizes[i]);
+	}
 	free(opts->gen.ram_inst_sizes);
 	free(opts);
 }