]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
lib/test_hmm: fix memory leak in dmirror_migrate_to_system()
authorHao Ge <hao.ge@linux.dev>
Thu, 28 May 2026 01:13:36 +0000 (09:13 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 9 Jun 2026 01:21:27 +0000 (18:21 -0700)
Move the kvcalloc() calls after the early return checks to avoid leaking
src_pfns and dst_pfns when end < start or mmget_not_zero() fails.

Link: https://lore.kernel.org/20260528011336.20797-1-hao.ge@linux.dev
Fixes: 775465fd26a3 ("lib/test_hmm: add zone device private THP test infrastructure")
Signed-off-by: Hao Ge <hao.ge@linux.dev>
Reviewed-by: Alistair Popple <apopple@nvidia.com>
Reported-by: Sashiko <sashiko-bot@kernel.org>
Reviewed-by: Balbir Singh <balbirs@nvidia.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
lib/test_hmm.c

index 63bf77dee98702c40dea11cc5a3997cd29812093..35f774ed2d999994ce3da5c23614ef1efbcdb6aa 100644 (file)
@@ -1111,9 +1111,6 @@ static int dmirror_migrate_to_system(struct dmirror *dmirror,
        unsigned long *src_pfns;
        unsigned long *dst_pfns;
 
-       src_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*src_pfns), GFP_KERNEL | __GFP_NOFAIL);
-       dst_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*dst_pfns), GFP_KERNEL | __GFP_NOFAIL);
-
        start = cmd->addr;
        end = start + size;
        if (end < start)
@@ -1123,6 +1120,9 @@ static int dmirror_migrate_to_system(struct dmirror *dmirror,
        if (!mmget_not_zero(mm))
                return -EINVAL;
 
+       src_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*src_pfns), GFP_KERNEL | __GFP_NOFAIL);
+       dst_pfns = kvcalloc(PTRS_PER_PTE, sizeof(*dst_pfns), GFP_KERNEL | __GFP_NOFAIL);
+
        cmd->cpages = 0;
        mmap_read_lock(mm);
        for (addr = start; addr < end; addr = next) {