From faffbaf71dbcb787d39f95fd0317c2e79117c75e Mon Sep 17 00:00:00 2001 From: stefanct Date: Sun, 23 Sep 2012 12:14:28 +0000 Subject: Fix memleaks in dmi.c. 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. Also, the tangling pointers are nulled when the memories are freed. This bug was found thanks to valgrind. Signed-off-by: Stefan Tauner Acked-by: Carl-Daniel Hailfinger git-svn-id: https://code.coreboot.org/svn/flashrom/trunk@1604 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- dmi.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'dmi.c') diff --git a/dmi.c b/dmi.c index dfc78e9..a6e2146 100644 --- a/dmi.c +++ b/dmi.c @@ -144,16 +144,29 @@ 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]); + 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]); -- cgit v1.2.1