File tree 1 file changed +20
-0
lines changed
1 file changed +20
-0
lines changed Original file line number Diff line number Diff line change @@ -1567,6 +1567,7 @@ static void kasan_memcmp(struct kunit *test)
1567
1567
static void kasan_strings (struct kunit * test )
1568
1568
{
1569
1569
char * ptr ;
1570
+ char * src ;
1570
1571
size_t size = 24 ;
1571
1572
1572
1573
/*
@@ -1578,6 +1579,25 @@ static void kasan_strings(struct kunit *test)
1578
1579
ptr = kmalloc (size , GFP_KERNEL | __GFP_ZERO );
1579
1580
KUNIT_ASSERT_NOT_ERR_OR_NULL (test , ptr );
1580
1581
1582
+ src = kmalloc (KASAN_GRANULE_SIZE , GFP_KERNEL | __GFP_ZERO );
1583
+ strscpy (src , "f0cacc1a0000000" , KASAN_GRANULE_SIZE );
1584
+
1585
+ /*
1586
+ * Make sure that strscpy() does not trigger KASAN if it overreads into
1587
+ * poisoned memory.
1588
+ *
1589
+ * The expected size does not include the terminator '\0'
1590
+ * so it is (KASAN_GRANULE_SIZE - 2) ==
1591
+ * KASAN_GRANULE_SIZE - ("initial removed character" + "\0").
1592
+ */
1593
+ KUNIT_EXPECT_EQ (test , KASAN_GRANULE_SIZE - 2 ,
1594
+ strscpy (ptr , src + 1 , KASAN_GRANULE_SIZE ));
1595
+
1596
+ /* strscpy should fail if the first byte is unreadable. */
1597
+ KUNIT_EXPECT_KASAN_FAIL (test , strscpy (ptr , src + KASAN_GRANULE_SIZE ,
1598
+ KASAN_GRANULE_SIZE ));
1599
+
1600
+ kfree (src );
1581
1601
kfree (ptr );
1582
1602
1583
1603
/*
You can’t perform that action at this time.
0 commit comments