diff options
author | Ulrich Ölmann <u.oelmann@pengutronix.de> | 2019-09-16 10:27:01 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-10-14 12:52:10 +0200 |
commit | 09fd5267dfb934f0850c372727453bee6b029d7e (patch) | |
tree | b29cbc40993e42e7c58fe91448d89bae327faa26 /common/imd.c | |
parent | 9bbaa740f6a86f04a27b5ed79ed7d6697123eae5 (diff) | |
download | barebox-09fd5267dfb934f0850c372727453bee6b029d7e.tar.gz barebox-09fd5267dfb934f0850c372727453bee6b029d7e.tar.xz |
imd: fix memory leak
Each invocation of 'imd' ate up to 1MB of RAM.
Signed-off-by: Ulrich Ölmann <u.oelmann@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/imd.c')
-rw-r--r-- | common/imd.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/common/imd.c b/common/imd.c index 05e118e773..913a01de87 100644 --- a/common/imd.c +++ b/common/imd.c @@ -337,8 +337,10 @@ int imd_command(int argc, char *argv[]) return -errno; imd_start = imd_get(buf, size); - if (IS_ERR(imd_start)) - return PTR_ERR(imd_start); + if (IS_ERR(imd_start)) { + ret = PTR_ERR(imd_start); + goto out; + } if (type == IMD_TYPE_INVALID) { imd_for_each(imd_start, imd) { @@ -356,7 +358,8 @@ int imd_command(int argc, char *argv[]) imd = imd_find_type(imd_start, type); if (!imd) { debug("No tag of type 0x%08x found\n", type); - return -ENODATA; + ret = -ENODATA; + goto out; } if (imd_is_string(type)) { @@ -370,8 +373,10 @@ int imd_command(int argc, char *argv[]) str = imd_concat_strings(imd); } - if (!str) - return -ENODATA; + if (!str) { + ret = -ENODATA; + goto out; + } if (variable_name) imd_command_setenv(variable_name, str); @@ -384,5 +389,8 @@ int imd_command(int argc, char *argv[]) } } - return 0; + ret = 0; +out: + free(buf); + return ret; } |