Skip to content

Commit 5e8afe3

Browse files
peaktocreekgregkh
authored andcommitted
selftest mm/mseal: fix test_seal_mremap_move_dontunmap_anyaddr
commit 072cd21 upstream. the syscall remap accepts following: mremap(src, size, size, MREMAP_MAYMOVE | MREMAP_DONTUNMAP, dst) when the src is sealed, the call will fail with error code: EPERM Previously, the test uses hard-coded 0xdeaddead as dst, and it will fail on the system with newer glibc installed. This patch removes test's dependency on glibc for mremap(), also fix the test and remove the hardcoded address. Link: https://lkml.kernel.org/r/20240807212320.2831848-1-jeffxu@chromium.org Fixes: 4926c7a ("selftest mm/mseal memory sealing") Signed-off-by: Jeff Xu <jeffxu@chromium.org> Reported-by: Pedro Falcato <pedro.falcato@gmail.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: Liam R. Howlett <Liam.Howlett@oracle.com> Cc: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ad3ca81 commit 5e8afe3

1 file changed

Lines changed: 36 additions & 21 deletions

File tree

tools/testing/selftests/mm/mseal_test.c

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,16 @@ static int sys_madvise(void *start, size_t len, int types)
9999
return sret;
100100
}
101101

102+
static void *sys_mremap(void *addr, size_t old_len, size_t new_len,
103+
unsigned long flags, void *new_addr)
104+
{
105+
void *sret;
106+
107+
errno = 0;
108+
sret = (void *) syscall(__NR_mremap, addr, old_len, new_len, flags, new_addr);
109+
return sret;
110+
}
111+
102112
static int sys_pkey_alloc(unsigned long flags, unsigned long init_val)
103113
{
104114
int ret = syscall(__NR_pkey_alloc, flags, init_val);
@@ -1104,12 +1114,12 @@ static void test_seal_mremap_shrink(bool seal)
11041114
}
11051115

11061116
/* shrink from 4 pages to 2 pages. */
1107-
ret2 = mremap(ptr, size, 2 * page_size, 0, 0);
1117+
ret2 = sys_mremap(ptr, size, 2 * page_size, 0, 0);
11081118
if (seal) {
1109-
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
1119+
FAIL_TEST_IF_FALSE(ret2 == (void *) MAP_FAILED);
11101120
FAIL_TEST_IF_FALSE(errno == EPERM);
11111121
} else {
1112-
FAIL_TEST_IF_FALSE(ret2 != MAP_FAILED);
1122+
FAIL_TEST_IF_FALSE(ret2 != (void *) MAP_FAILED);
11131123

11141124
}
11151125

@@ -1136,7 +1146,7 @@ static void test_seal_mremap_expand(bool seal)
11361146
}
11371147

11381148
/* expand from 2 page to 4 pages. */
1139-
ret2 = mremap(ptr, 2 * page_size, 4 * page_size, 0, 0);
1149+
ret2 = sys_mremap(ptr, 2 * page_size, 4 * page_size, 0, 0);
11401150
if (seal) {
11411151
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
11421152
FAIL_TEST_IF_FALSE(errno == EPERM);
@@ -1169,7 +1179,7 @@ static void test_seal_mremap_move(bool seal)
11691179
}
11701180

11711181
/* move from ptr to fixed address. */
1172-
ret2 = mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_FIXED, newPtr);
1182+
ret2 = sys_mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_FIXED, newPtr);
11731183
if (seal) {
11741184
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
11751185
FAIL_TEST_IF_FALSE(errno == EPERM);
@@ -1288,7 +1298,7 @@ static void test_seal_mremap_shrink_fixed(bool seal)
12881298
}
12891299

12901300
/* mremap to move and shrink to fixed address */
1291-
ret2 = mremap(ptr, size, 2 * page_size, MREMAP_MAYMOVE | MREMAP_FIXED,
1301+
ret2 = sys_mremap(ptr, size, 2 * page_size, MREMAP_MAYMOVE | MREMAP_FIXED,
12921302
newAddr);
12931303
if (seal) {
12941304
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
@@ -1319,7 +1329,7 @@ static void test_seal_mremap_expand_fixed(bool seal)
13191329
}
13201330

13211331
/* mremap to move and expand to fixed address */
1322-
ret2 = mremap(ptr, page_size, size, MREMAP_MAYMOVE | MREMAP_FIXED,
1332+
ret2 = sys_mremap(ptr, page_size, size, MREMAP_MAYMOVE | MREMAP_FIXED,
13231333
newAddr);
13241334
if (seal) {
13251335
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
@@ -1350,7 +1360,7 @@ static void test_seal_mremap_move_fixed(bool seal)
13501360
}
13511361

13521362
/* mremap to move to fixed address */
1353-
ret2 = mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_FIXED, newAddr);
1363+
ret2 = sys_mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_FIXED, newAddr);
13541364
if (seal) {
13551365
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
13561366
FAIL_TEST_IF_FALSE(errno == EPERM);
@@ -1379,14 +1389,13 @@ static void test_seal_mremap_move_fixed_zero(bool seal)
13791389
/*
13801390
* MREMAP_FIXED can move the mapping to zero address
13811391
*/
1382-
ret2 = mremap(ptr, size, 2 * page_size, MREMAP_MAYMOVE | MREMAP_FIXED,
1392+
ret2 = sys_mremap(ptr, size, 2 * page_size, MREMAP_MAYMOVE | MREMAP_FIXED,
13831393
0);
13841394
if (seal) {
13851395
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
13861396
FAIL_TEST_IF_FALSE(errno == EPERM);
13871397
} else {
13881398
FAIL_TEST_IF_FALSE(ret2 == 0);
1389-
13901399
}
13911400

13921401
REPORT_TEST_PASS();
@@ -1409,21 +1418,21 @@ static void test_seal_mremap_move_dontunmap(bool seal)
14091418
}
14101419

14111420
/* mremap to move, and don't unmap src addr. */
1412-
ret2 = mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_DONTUNMAP, 0);
1421+
ret2 = sys_mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_DONTUNMAP, 0);
14131422
if (seal) {
14141423
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
14151424
FAIL_TEST_IF_FALSE(errno == EPERM);
14161425
} else {
1426+
/* kernel will allocate a new address */
14171427
FAIL_TEST_IF_FALSE(ret2 != MAP_FAILED);
1418-
14191428
}
14201429

14211430
REPORT_TEST_PASS();
14221431
}
14231432

14241433
static void test_seal_mremap_move_dontunmap_anyaddr(bool seal)
14251434
{
1426-
void *ptr;
1435+
void *ptr, *ptr2;
14271436
unsigned long page_size = getpagesize();
14281437
unsigned long size = 4 * page_size;
14291438
int ret;
@@ -1438,24 +1447,30 @@ static void test_seal_mremap_move_dontunmap_anyaddr(bool seal)
14381447
}
14391448

14401449
/*
1441-
* The 0xdeaddead should not have effect on dest addr
1442-
* when MREMAP_DONTUNMAP is set.
1450+
* The new address is any address that not allocated.
1451+
* use allocate/free to similate that.
14431452
*/
1444-
ret2 = mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_DONTUNMAP,
1445-
0xdeaddead);
1453+
setup_single_address(size, &ptr2);
1454+
FAIL_TEST_IF_FALSE(ptr2 != (void *)-1);
1455+
ret = sys_munmap(ptr2, size);
1456+
FAIL_TEST_IF_FALSE(!ret);
1457+
1458+
/*
1459+
* remap to any address.
1460+
*/
1461+
ret2 = sys_mremap(ptr, size, size, MREMAP_MAYMOVE | MREMAP_DONTUNMAP,
1462+
(void *) ptr2);
14461463
if (seal) {
14471464
FAIL_TEST_IF_FALSE(ret2 == MAP_FAILED);
14481465
FAIL_TEST_IF_FALSE(errno == EPERM);
14491466
} else {
1450-
FAIL_TEST_IF_FALSE(ret2 != MAP_FAILED);
1451-
FAIL_TEST_IF_FALSE((long)ret2 != 0xdeaddead);
1452-
1467+
/* remap success and return ptr2 */
1468+
FAIL_TEST_IF_FALSE(ret2 == ptr2);
14531469
}
14541470

14551471
REPORT_TEST_PASS();
14561472
}
14571473

1458-
14591474
static void test_seal_merge_and_split(void)
14601475
{
14611476
void *ptr;

0 commit comments

Comments
 (0)