[flashrom] [PATCH 1/3] Fix memleaks in dmi.c.

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Sun Sep 23 01:30:50 CEST 2012


Am 14.09.2012 00:38 schrieb Stefan Tauner:
> In dmi_init() we populate static char *dmistrings[] with values that get
> later compared in dmi_match(). Those strings are actually strduped in
> get_dmi_string() and hence need to be freed later. This patch accomplishes
> this by registering another shutdown method.
>
> This bug was found thanks to valgrind.
>
> Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>

Good find, especially the puts() which had crept in there.
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
with a small comment.


> diff --git a/dmi.c b/dmi.c
> index dfc78e9..fd260a6 100644
> --- a/dmi.c
> +++ b/dmi.c
> @@ -144,16 +144,28 @@ static char *get_dmi_string(const char *string_name)
>  
>  	result = strdup(answerbuf);
>  	if (!result)
> -		puts("WARNING: Out of memory - DMI support fails");
> +		msg_perr("WARNING: Out of memory - DMI support fails");
>  
>  	return result;
>  }
>  
> +static int dmi_shutdown(void *data)
> +{
> +	int i;
> +	for (i = 0; i < ARRAY_SIZE(dmistrings); i++) {
> +		free(dmistrings[i]);

libflashrom allows calling programmer_init() and programmer_shutdown()
again after one flashrom run. For that case, we want the second run to
have zeroed dmistrings[i]. Please insert
dmistrings[i] = NULL;


> +	}
> +	return 0;
> +}
> +
>  void dmi_init(void)
>  {
>  	int i;
>  	char *chassis_type;
>  
> +	if (register_shutdown(dmi_shutdown, NULL))
> +		return;
> +
>  	has_dmi_support = 1;
>  	for (i = 0; i < ARRAY_SIZE(dmidecode_names); i++) {
>  		dmistrings[i] = get_dmi_string(dmidecode_names[i]);

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/





More information about the flashrom mailing list