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

IvanHu ivan.hu at canonical.com
Thu Jan 9 07:09:06 UTC 2014


On 01/09/2014 01:44 AM, Colin King wrote:
> 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;
>

Acked-by: Ivan Hu <ivan.hu at canonical.com>



More information about the fwts-devel mailing list