xfs
[Top] [All Lists]

[PATCH] xfsprogs: fix resouce leak in longform_dir2_rebuild()

To: xfsprogs <xfs@xxxxxxxxxxx>
Subject: [PATCH] xfsprogs: fix resouce leak in longform_dir2_rebuild()
From: Li Zhong <zhong@xxxxxxxxxxxxxxxxxx>
Date: Sat, 12 Oct 2013 14:42:54 +0800
Cc: Chandra Seetharaman <sekharan@xxxxxxxxxx>
Delivered-to: xfs@xxxxxxxxxxx
coverity scan 997010 reported following leak in repair/phase6.c

1309                if (error) {
1310                        do_warn(
1311        _("space reservation failed (%d), filesystem may be out of 
space\n"),
1312                                error);
        25. Breaking from loop
1313                        break;
1314                }

......

1342                libxfs_trans_commit(tp,
1343                                XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC);
1344        }

CID 997010 (#1 of 1): Resource leak (RESOURCE_LEAK)
26. leaked_storage: Variable "tp" going out of scope leaks the storage it 
points to.
1345}

Though not reported by coverity, it seems that there might be some entries in
flist which needs to be freed in the failure case below libxfs_dir_createname(),
so I also added a bmap cancel there.

Signed-off-by: Li Zhong <zhong@xxxxxxxxxxxxxxxxxx>
---
 repair/phase6.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/repair/phase6.c b/repair/phase6.c
index a4ad7a3..0d88ad2 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -1310,6 +1310,8 @@ longform_dir2_rebuild(
                        do_warn(
        _("space reservation failed (%d), filesystem may be out of space\n"),
                                error);
+                       libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
+                                               XFS_TRANS_ABORT);
                        break;
                }
 
@@ -1323,6 +1325,7 @@ longform_dir2_rebuild(
                        do_warn(
 _("name create failed in ino %" PRIu64 " (%d), filesystem may be out of 
space\n"),
                                ino, error);
+                       libxfs_bmap_cancel(&flist);
                        libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
                                                XFS_TRANS_ABORT);
                        break;
-- 
1.8.1.4


<Prev in Thread] Current Thread [Next in Thread>