diff options
author | Byongho Lee <bhlee.kernel@gmail.com> | 2015-08-21 17:51:52 +0900 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2015-08-31 19:25:12 +0200 |
commit | ae60507e59a1cad43303a0f9e1b72ef4e5bb1e72 (patch) | |
tree | 180a89c224d665244ca3c9b1da680203b2c62d5d /cmds-scrub.c | |
parent | d7748770a78a4a44f39f4f0e629885a255d24d90 (diff) | |
download | btrfs-progs-ae60507e59a1cad43303a0f9e1b72ef4e5bb1e72.tar.gz |
btrfs-progs: fix memory leaks in error path
This patch includes below fixes in error path:
1. fix memory leaks if realloc() fails
2. add missing call free_history() before return error in scrub_read_file()
Signed-off-by: Byongho Lee <bhlee.kernel@gmail.com>
Reviewed-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'cmds-scrub.c')
-rw-r--r-- | cmds-scrub.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/cmds-scrub.c b/cmds-scrub.c index 5a85dc4..91cf678 100644 --- a/cmds-scrub.c +++ b/cmds-scrub.c @@ -502,12 +502,16 @@ again: } return p; } - if (avail == -1) + if (avail == -1) { + free_history(p); return ERR_PTR(-errno); + } avail += old_avail; i = 0; while (i < avail) { + void *tmp; + switch (state) { case 0: /* start of file */ ret = scrub_kvread(&i, @@ -534,11 +538,17 @@ again: continue; } ++curr; + tmp = p; p = realloc(p, (curr + 2) * sizeof(*p)); - if (p) - p[curr] = malloc(sizeof(**p)); - if (!p || !p[curr]) + if (!p) { + free_history(tmp); return ERR_PTR(-errno); + } + p[curr] = malloc(sizeof(**p)); + if (!p[curr]) { + free_history(p); + return ERR_PTR(-errno); + } memset(p[curr], 0, sizeof(**p)); p[curr + 1] = NULL; ++state; |