From 4338c5c06fbe92fdef9a5f0f7e457fae98c94b4d Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 15 Aug 2018 09:53:44 -0700 Subject: [PATCH] Fix traverse_impl() kmem leak The error path must free the memory allocated by this function or it will be leaked. In practice, this would leak only a few bytes of memory under rare circumstances and thus is unlikely to have caused any real problems. This issue was caught by the kmemleak. Reviewed-by: Giuseppe Di Natale Reviewed-by: George Melikov Reviewed-by: Chunwei Chen Signed-off-by: Brian Behlendorf Closes #7791 --- module/zfs/dmu_traverse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/zfs/dmu_traverse.c b/module/zfs/dmu_traverse.c index f0b5356180..f426520991 100644 --- a/module/zfs/dmu_traverse.c +++ b/module/zfs/dmu_traverse.c @@ -650,7 +650,7 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp, */ if (!(td->td_flags & TRAVERSE_HARD) || !(td->td_flags & TRAVERSE_PRE)) - return (err); + goto out; } else { osp = buf->b_data; traverse_zil(td, &osp->os_zil_header); @@ -671,7 +671,7 @@ traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp, while (!pd->pd_exited) cv_wait_sig(&pd->pd_cv, &pd->pd_mtx); mutex_exit(&pd->pd_mtx); - +out: mutex_destroy(&pd->pd_mtx); cv_destroy(&pd->pd_cv);