Hello,

This patch fixes some memory leaks from datatrak implementation.

Claudiu
From 5668e8c78c3ee07b486473dbe5ea00772c3117c0 Mon Sep 17 00:00:00 2001
From: Claudiu Olteanu <[email protected]>
Date: Sun, 22 Mar 2015 13:38:51 +0200
Subject: [PATCH] Resolve some memory leak on datatrak source

The result of byte_to_bits should be freed by the caller.
This patch frees the memory allocated by that function.
Also there were some memory leaks in data_import and
read_file_header functions when an error occured.

Signed-off-by: Claudiu Olteanu <[email protected]>
---
 datatrak.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/datatrak.c b/datatrak.c
index 573796c..3dbddb6 100644
--- a/datatrak.c
+++ b/datatrak.c
@@ -120,6 +120,8 @@ static struct sample *dtrak_profile(struct dive *dt_dive, FILE *archivo)
 			}
 			j = 0;
 		}
+		free(byte);
+
 		// In commit 5f44fdd setpoint replaced po2, so although this is not necesarily CCR dive ...
 		if (is_O2)
 			sample->setpoint.mbar = calculate_depth_to_mbar(sample->depth.mm, dt_dive->surface_pressure, 0) * o2percent / 100;
@@ -141,6 +143,7 @@ static dtrakheader read_file_header(FILE *archivo)
 	fread(lector, 1, headerbytes, archivo);
 	if (two_bytes_to_int(lector[0], lector[1]) != 0xA100) {
 		puts("Error: the file does not appear to be a DATATRAK divelog");
+		free(lector);
 		return fileheader;
 	}
 	fileheader.header = (lector[0] << 8) + lector[1];
@@ -394,6 +397,8 @@ static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
 	if (byte[7] != 0)
 		taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "salt water")));
 
+	free(byte);
+
 	/*
 	 * Dive Type 2 - Bit table, use tags again
 	 */
@@ -408,6 +413,7 @@ static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
 		is_SCR = 1;
 		dt_dive->dc.divemode = PSCR;
 	}
+	free(byte);
 
 	/*
 	 *  Dive Activity 1 - Bit table, use tags again
@@ -430,7 +436,7 @@ static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
 		taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "ice")));
 	if (byte[7] != 0)
 		taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "search")));
-
+	free(byte);
 
 	/*
 	 * Dive Activity 2 - Bit table, use tags again
@@ -447,6 +453,7 @@ static struct dive dt_dive_parser(FILE *archivo, struct dive *dt_dive)
 		taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "photo")));
 	if (byte[4] != 0)
 		taglist_add_tag(&dt_dive->tag_list, strdup(QT_TRANSLATE_NOOP("gettextFromC", "other")));
+	free(byte);
 
 	/*
 	 * Other activities - String  1st byte = long
@@ -653,6 +660,7 @@ void datatrak_import(const char *file, struct dive_table *table)
 
 	if ((archivo = subsurface_fopen(file, "rb")) == NULL) {
 		puts("Error: couldn't open the file");
+		free(fileheader);
 		return;
 	}
 
@@ -674,5 +682,5 @@ void datatrak_import(const char *file, struct dive_table *table)
 	taglist_cleanup(&g_tag_list);
 	fclose(archivo);
 	sort_table(table);
-	free (fileheader);
+	free(fileheader);
 }
-- 
2.1.4

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to