summaryrefslogtreecommitdiff
path: root/cmds-scrub.c
diff options
context:
space:
mode:
authorByongho Lee <bhlee.kernel@gmail.com>2015-08-21 17:51:52 +0900
committerDavid Sterba <dsterba@suse.com>2015-08-31 19:25:12 +0200
commitae60507e59a1cad43303a0f9e1b72ef4e5bb1e72 (patch)
tree180a89c224d665244ca3c9b1da680203b2c62d5d /cmds-scrub.c
parentd7748770a78a4a44f39f4f0e629885a255d24d90 (diff)
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.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/cmds-scrub.c b/cmds-scrub.c
index 5a85dc47..91cf6784 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;