[PATCH] fwts: fix common realloc() memory leak anti-pattern (LP: #1267193)

Colin King colin.king at canonical.com
Wed Jan 8 17:44:25 UTC 2014


From: Colin Ian King <colin.king at canonical.com>

cppcheck found some minor memory leaks with failed reallocs.

Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
 src/acpica/fwts_acpica.c       | 11 ++++++++---
 src/lib/src/fwts_acpi_tables.c |  7 ++++++-
 src/lib/src/fwts_acpid.c       | 10 ++++++++--
 src/lib/src/fwts_args.c        | 11 ++++++++---
 src/lib/src/fwts_log.c         |  9 +++++++--
 src/lib/src/fwts_pipeio.c      | 10 ++++++++--
 6 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/src/acpica/fwts_acpica.c b/src/acpica/fwts_acpica.c
index 3e011a8..06aa0b7 100644
--- a/src/acpica/fwts_acpica.c
+++ b/src/acpica/fwts_acpica.c
@@ -427,12 +427,17 @@ void fwts_acpica_vprintf(const char *fmt, va_list args)
 		else
 			buffer_len = 0;
 	} else {
+		char *new_buf;
+
 		buffer_len += tmp_len;
-		buffer = realloc(buffer, buffer_len);
-		if (buffer)
+		new_buf = realloc(buffer, buffer_len);
+		if (new_buf) {
+			buffer = new_buf;
 			strcat(buffer, tmp);
-		else
+		} else {
+			free(buffer);
 			buffer_len = 0;
+		}
 	}
 
 	if (index(buffer, '\n') != NULL) {
diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
index e899e5e..b226e51 100644
--- a/src/lib/src/fwts_acpi_tables.c
+++ b/src/lib/src/fwts_acpi_tables.c
@@ -415,6 +415,7 @@ static uint8_t *fwts_acpi_load_table_from_acpidump(FILE *fp, char *name, uint64_
 
 	/* Pull in 16 bytes at a time */
 	while (fgets(buffer, sizeof(buffer), fp) ) {
+		uint8_t *new_tmp;
 		int n;
 		buffer[56] = '\0';	/* truncate */
 		if ((n = sscanf(buffer,"  %x: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx",
@@ -426,8 +427,12 @@ static uint8_t *fwts_acpi_load_table_from_acpidump(FILE *fp, char *name, uint64_
 			break;
 
 		len += (n - 1);
-		if ((tmp = realloc(tmp, len)) == NULL)
+		if ((new_tmp = realloc(tmp, len)) == NULL) {
+			free(tmp);
 			return NULL;
+		} else
+			tmp = new_tmp;
+
 		memcpy(tmp + offset, data, n-1);
 	}
 
diff --git a/src/lib/src/fwts_acpid.c b/src/lib/src/fwts_acpid.c
index 5aac045..3620a45 100644
--- a/src/lib/src/fwts_acpid.c
+++ b/src/lib/src/fwts_acpid.c
@@ -105,9 +105,15 @@ char *fwts_acpi_event_read(const int fd, size_t *length, const int timeout)
 			return NULL;
 		}
 		else {
-			ptr = realloc(ptr, size + n + 1);
-			if (ptr == NULL)
+			char *new_ptr;
+
+			new_ptr = realloc(ptr, size + n + 1);
+			if (new_ptr == NULL) {
+				free(ptr);
 				return NULL;
+			} else
+				ptr = new_ptr;
+
 			memcpy(ptr + size, buffer, n);
 			size += n;
 			*(ptr+size) = 0;
diff --git a/src/lib/src/fwts_args.c b/src/lib/src/fwts_args.c
index 829182a..631ba5f 100644
--- a/src/lib/src/fwts_args.c
+++ b/src/lib/src/fwts_args.c
@@ -129,15 +129,20 @@ int fwts_args_parse(fwts_framework *fw, const int argc, char * const argv[])
 
 			if (short_name && (len = strlen(short_name)) > 0) {
 				if (short_options) {
-					short_options = realloc(short_options,
+					char *new_short_options;
+
+					new_short_options = realloc(short_options,
 						short_options_len + len + 1);
-					if (short_options == NULL) {
+					if (new_short_options == NULL) {
+						free(short_options);
 						free(long_options);
 						fwts_log_error(fw,
 							"Out of memory "
 							"allocating options.");
 						return FWTS_ERROR;
-					}
+					} else
+						short_options = new_short_options;
+
 					strcat(short_options, short_name);
 					short_options_len += (len + 1);
 				} else {
diff --git a/src/lib/src/fwts_log.c b/src/lib/src/fwts_log.c
index 53cdbc8..8d9923e 100644
--- a/src/lib/src/fwts_log.c
+++ b/src/lib/src/fwts_log.c
@@ -578,11 +578,16 @@ char *fwts_log_get_filenames(const char *filename, const fwts_log_type type)
 			}
 
 			if (filenames) {
+				char *new_filenames;
+
 				len += strlen(tmp) + 2;
-				if ((filenames = realloc(filenames, len)) == NULL) {
+				if ((new_filenames = realloc(filenames, len)) == NULL) {
+					free(filenames);
 					free(tmp);
 					return NULL;
-				}
+				} else
+					filenames = new_filenames;
+
 				strcat(filenames, " ");
 				strcat(filenames, tmp);
 			} else {
diff --git a/src/lib/src/fwts_pipeio.c b/src/lib/src/fwts_pipeio.c
index 13f8150..1f21ed7 100644
--- a/src/lib/src/fwts_pipeio.c
+++ b/src/lib/src/fwts_pipeio.c
@@ -97,9 +97,15 @@ char *fwts_pipe_read(const int fd, ssize_t *length)
 			}
 		}
 		else {
-			ptr = realloc(ptr, size + n + 1);
-			if (ptr == NULL)
+			char *new_ptr;
+
+			new_ptr = realloc(ptr, size + n + 1);
+			if (new_ptr == NULL) {
+				free(ptr);
 				return NULL;
+			} else
+				ptr = new_ptr;
+
 			memcpy(ptr + size, buffer, n);
 			size += n;
 			*(ptr+size) = 0;
-- 
1.8.5.2




More information about the fwts-devel mailing list