btrfs-progs: fix memory leaks in error path
PATCH 1/1 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()
--- btrfs-list.c | 8 ++++++++ cmds-scrub.c | 18 ++++++++++++++---- qgroup.c | 8 ++++++++ 3 files changed, 30 insertions(+), 4 deletions(-)
btrfs-list.c +8 -0
@@ -254,11 +254,15 @@ static int btrfs_list_setup_comparer(struct btrfs_list_comparer_set **comp_set,BUG_ON (set->ncomps > set->total);if (set->ncomps == set->total) { +void *tmp; + size = set->total +BTRFS_LIST_NCOMPS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_list_comparer ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }
@@ -1232,11 +1236,15 @@ int btrfs_list_setup_filter(struct btrfs_list_filter_set **filter_set,BUG_ON (set->nfilters > set->total);if (set->nfilters == set->total) { +void *tmp; + size = set->total +BTRFS_LIST_NFILTERS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_list_filter ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }
cmds-scrub.c +14 -4
@@ -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;
qgroup.c +8 -0
@@ -465,12 +465,16 @@ int btrfs_qgroup_setup_comparer(struct btrfs_qgroup_comparer_set **comp_set,BUG_ON (set->ncomps > set->total);if (set->ncomps == set->total) { +void *tmp; + size = set->total +BTRFS_QGROUP_NCOMPS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_qgroup_comparer ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }
@@ -836,12 +840,16 @@ int btrfs_qgroup_setup_filter(struct btrfs_qgroup_filter_set **filter_set,BUG_ON (set->nfilters > set->total);if (set->nfilters == set->total) { +void *tmp; + size = set->total +BTRFS_QGROUP_NFILTERS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_qgroup_filter ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); } memset(&set->filters[set->total], 0,
Signature · 1 line
2.5.0
Hi, Byongho Lee
Quoted 11 lines
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Byongho Lee
Sent: Friday, August 21, 2015 11:10 AM
To: [email protected]
Subject: [PATCH] btrfs-progs: fix memory leaks in error pathThis patch includes below fixes in error path:
1. fix memory leaks ifrealloc()fails
2. add missing callfree_history()before return error inscrub_read_file()
Quoted 5 lines
Signed-off-by Byongho Lee <[email protected]>--- btrfs-list.c | 8 ++++++++ cmds-scrub.c | 18 ++++++++++++++---- qgroup.c | 8 ++++++++
Similar problem in cmds-send.c:cmds-send.c: s->clone_sources = realloc(s->clone_sources,
Thanks
Zhaolei
Quoted 129 lines
3 files changed, 30 insertions(+), 4 deletions(-)btrfs-list.c +8
-0@@ -254,11 +254,15 @@ static int btrfs_list_setup_comparer(struct btrfs_list_comparer_set **comp_set,BUG_ON (set->ncomps > set->total);if (set->ncomps == set->total) { +void *tmp; + size = set->total +BTRFS_LIST_NCOMPS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_list_comparer ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }@@ -1232,11 +1236,15 @@ int btrfs_list_setup_filter(struct btrfs_list_filter_set **filter_set,BUG_ON (set->nfilters > set->total);if (set->nfilters == set->total) { +void *tmp; + size = set->total +BTRFS_LIST_NFILTERS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_list_filter ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }cmds-scrub.c index 5a85dc473c94..91cf67841849 renamed from cmds-scrub.c +0
-0100644
cmds-scrub.c +14
-4@@ -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;qgroup.c +8
-0@@ -465,12 +465,16 @@ int btrfs_qgroup_setup_comparer(struct btrfs_qgroup_comparer_set **comp_set,BUG_ON (set->ncomps > set->total);if (set->ncomps == set->total) { +void *tmp; + size = set->total +BTRFS_QGROUP_NCOMPS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_qgroup_comparer ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }@@ -836,12 +840,16 @@ int btrfs_qgroup_setup_filter(struct btrfs_qgroup_filter_set **filter_set,BUG_ON (set->nfilters > set->total);if (set->nfilters == set->total) { +void *tmp; + size = set->total +BTRFS_QGROUP_NFILTERS_INCREASE ; size =sizeof (*set) + size *sizeof (struct btrfs_qgroup_filter ); + tmp = set; set =realloc (set, size);if (!set) {fprintf (stderr,"memory allocation failed\n" ); +free (tmp);exit (1 ); }memset(&set->filters[set->total], 0,
--
2.5.0--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at
http://vger.kernel.org/majordomo-info.html
Quoted 20 lines · Zhao Lei
Hi, Byongho Lee
Quoted 11 lines
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of Byongho Lee
Sent: Friday, August 21, 2015 11:10 AM
To: [email protected]
Subject: [PATCH] btrfs-progs: fix memory leaks in error pathThis patch includes below fixes in error path:
1. fix memory leaks ifrealloc()fails
2. add missing callfree_history()before return error inscrub_read_file()Quoted 5 lines
Signed-off-by Byongho Lee <[email protected]>--- btrfs-list.c | 8 ++++++++ cmds-scrub.c | 18 ++++++++++++++---- qgroup.c | 8 ++++++++
Quoted 3 lines
Similar problem in
cmds-send.c:cmds-send.c:s->clone_sources= realloc(s->clone_sources,
Thank you for feedback.
You're right, I missed that point.
I'll prepare v2 patch.
Regards,
Lee
David Sterba
AppliedQuoted 5 lines · Byongho Lee
This patch includes below fixes in error path:
1. fix memory leaks ifrealloc()fails
2. add missing callfree_history()before return error inscrub_read_file()Signed-off-by Byongho Lee <[email protected]>
Applied, thanks.