From 14e36e34ed975b1ffbbcbc18a7743a3a4859be3d Mon Sep 17 00:00:00 2001 From: Li Zhong Date: Tue, 15 Oct 2013 02:55:31 +0000 Subject: [PATCH] xfsprogs: fix resource leak in longform_dir2_rebuild() coverity scan 997010 reported following leak: 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(), and libxfs_bunmapi(). The fix cleans up the code by stacking the error handling at the end of the function, and jumping to the error handler label for the above cases. (fail directly by calling res_failed() for reservation failure.) Signed-off-by: Li Zhong Reviewed-by: Dave Chinner Signed-off-by: Rich Johnston --- repair/phase6.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index 41f6bfc2b..2a3743827 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1286,9 +1286,7 @@ longform_dir2_rebuild( &firstblock, &flist, &done); if (error) { do_warn(_("xfs_bunmapi failed -- error - %d\n"), error); - libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | - XFS_TRANS_ABORT); - return; + goto out_bmap_cancel; } ASSERT(done); @@ -1312,12 +1310,8 @@ longform_dir2_rebuild( nres = XFS_CREATE_SPACE_RES(mp, p->name.len); error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_create, nres, 0); - if (error) { - do_warn( - _("space reservation failed (%d), filesystem may be out of space\n"), - error); - break; - } + if (error) + res_failed(error); libxfs_trans_ijoin(tp, ip, 0); libxfs_trans_ihold(tp, ip); @@ -1329,9 +1323,7 @@ longform_dir2_rebuild( do_warn( _("name create failed in ino %" PRIu64 " (%d), filesystem may be out of space\n"), ino, error); - libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | - XFS_TRANS_ABORT); - break; + goto out_bmap_cancel; } error = libxfs_bmap_finish(&tp, &flist, &committed); @@ -1339,15 +1331,19 @@ _("name create failed in ino %" PRIu64 " (%d), filesystem may be out of space\n" do_warn( _("bmap finish failed (%d), filesystem may be out of space\n"), error); - libxfs_bmap_cancel(&flist); - libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | - XFS_TRANS_ABORT); - break; + goto out_bmap_cancel; } libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC); } + + return; + +out_bmap_cancel: + libxfs_bmap_cancel(&flist); + libxfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + return; } -- 2.47.2