Skip to content

Commit 0b49c7d

Browse files
Christian A. Ehrhardtakpm00
authored andcommitted
lib: kunit_iov_iter: fix memory leaks
Use vfree() instead of vunmap() to free the buffer allocated by iov_kunit_create_buffer() because vunmap() does not honour VM_MAP_PUT_PAGES. In order for this to work the page array itself must not be managed by kunit. Remove the folio_put() when destroying a folioq. This is handled by vfree(), now. Pointed out by sashiko.dev on a previous iteration of this series. Tested by running the kunit test 10000 times in a loop. Link: https://lkml.kernel.org/r/20260326214905.818170-4-lk@c--e.de Fixes: 2d71340 ("iov_iter: Kunit tests for copying to/from an iterator") Signed-off-by: Christian A. Ehrhardt <lk@c--e.de> Cc: David Howells <dhowells@redhat.com> Cc: David Gow <davidgow@google.com> Cc: Kees Cook <kees@kernel.org> Cc: Petr Mladek <pmladek@suse.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent 118cf3f commit 0b49c7d

1 file changed

Lines changed: 8 additions & 6 deletions

File tree

lib/tests/kunit_iov_iter.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static inline u8 pattern(unsigned long x)
4242

4343
static void iov_kunit_unmap(void *data)
4444
{
45-
vunmap(data);
45+
vfree(data);
4646
}
4747

4848
static void *__init iov_kunit_create_buffer(struct kunit *test,
@@ -53,17 +53,22 @@ static void *__init iov_kunit_create_buffer(struct kunit *test,
5353
unsigned long got;
5454
void *buffer;
5555

56-
pages = kunit_kcalloc(test, npages, sizeof(struct page *), GFP_KERNEL);
57-
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pages);
56+
pages = kzalloc_objs(struct page *, npages, GFP_KERNEL);
57+
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pages);
5858
*ppages = pages;
5959

6060
got = alloc_pages_bulk(GFP_KERNEL, npages, pages);
6161
if (got != npages) {
6262
release_pages(pages, got);
63+
kvfree(pages);
6364
KUNIT_ASSERT_EQ(test, got, npages);
6465
}
6566

6667
buffer = vmap(pages, npages, VM_MAP | VM_MAP_PUT_PAGES, PAGE_KERNEL);
68+
if (buffer == NULL) {
69+
release_pages(pages, got);
70+
kvfree(pages);
71+
}
6772
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buffer);
6873

6974
kunit_add_action_or_reset(test, iov_kunit_unmap, buffer);
@@ -369,9 +374,6 @@ static void iov_kunit_destroy_folioq(void *data)
369374

370375
for (folioq = data; folioq; folioq = next) {
371376
next = folioq->next;
372-
for (int i = 0; i < folioq_nr_slots(folioq); i++)
373-
if (folioq_folio(folioq, i))
374-
folio_put(folioq_folio(folioq, i));
375377
kfree(folioq);
376378
}
377379
}

0 commit comments

Comments
 (0)