[PATCH] mm/slub, kunit: Make slub_kunit pass even when SLAB_RED_ZONE flag is set

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Testcase test_next_pointer in slub_kunit fails when SLAB_RED_ZONE flag
is globally set. This is because on_freelist() cuts corrupted freelist
chain and does not update cut objects' redzone to SLUB_RED_ACTIVE.

When the test validates a slab that whose freelist is cut, it expects
redzone of objects unreachable by freelist is set to SLUB_RED_ACTIVE.
And it reports "Left Redzone overritten" error because the expectation
failed.

This patch makes slub_kunit expect two more errors for reporting and
fixing red overwritten error when SLAB_RED_ZONE flag is set.

The test passes on slub_debug and slub_debug=Z after this patch.

Signed-off-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx>
---
 lib/slub_kunit.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/lib/slub_kunit.c b/lib/slub_kunit.c
index 8662dc6cb509..7cf1fb5a7fde 100644
--- a/lib/slub_kunit.c
+++ b/lib/slub_kunit.c
@@ -45,21 +45,36 @@ static void test_next_pointer(struct kunit *test)
 	 * Expecting three errors.
 	 * One for the corrupted freechain and the other one for the wrong
 	 * count of objects in use. The third error is fixing broken cache.
+	 *
+	 * When flag SLUB_RED_ZONE is set, we expect two more errors for reporting
+	 * and fixing overwritten redzone error. This two errors are detected
+	 * because SLUB cuts corrupted freelist in on_freelist(), but does not
+	 * update its redzone to SLUB_RED_ACTIVE.
 	 */
 	validate_slab_cache(s);
-	KUNIT_EXPECT_EQ(test, 3, slab_errors);
+
+	if (s->flags & SLAB_RED_ZONE)
+		KUNIT_EXPECT_EQ(test, 5, slab_errors);
+	else
+		KUNIT_EXPECT_EQ(test, 3, slab_errors);
 
 	/*
 	 * Try to repair corrupted freepointer.
 	 * Still expecting two errors. The first for the wrong count
 	 * of objects in use.
 	 * The second error is for fixing broken cache.
+	 *
+	 * When SLUB_RED_ZONE flag is set, we expect two more errors
+	 * for same reason as above.
 	 */
 	*ptr_addr = tmp;
 	slab_errors = 0;
 
 	validate_slab_cache(s);
-	KUNIT_EXPECT_EQ(test, 2, slab_errors);
+	if (s->flags & SLAB_RED_ZONE)
+		KUNIT_EXPECT_EQ(test, 4, slab_errors);
+	else
+		KUNIT_EXPECT_EQ(test, 2, slab_errors);
 
 	/*
 	 * Previous validation repaired the count of objects in use.
-- 
2.33.1





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux