Skip to content

Commit 98d1af9

Browse files
committed
lib: dirtyc0w_shmem: userfaultfd01: Add safe_userfaultfd()
Use TINFO in tst_res() followed by tst_brk(TBROK, ...). Link: https://lore.kernel.org/ltp/20251030192543.761804-1-pvorel@suse.cz/ Reviewed-by: Wei Gao <wegao@suse.com> Reviewed-by: Andrea Cervesato <andrea.cervesato@suse.com> Signed-off-by: Petr Vorel <pvorel@suse.cz>
1 parent 3447f8d commit 98d1af9

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

include/lapi/userfaultfd.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
/*
33
* Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org>
44
* Copyright (C) 2015,2022 Red Hat, Inc.
5+
* Copyright (c) Linux Test Project, 2025
56
*
67
* Mostly copied/adapted from <linux/userfaultfd.h>
78
*/
89

910
#ifndef LAPI_USERFAULTFD_H__
1011
#define LAPI_USERFAULTFD_H__
1112

13+
#include <stdbool.h>
1214
#include <unistd.h>
1315
#include <sys/types.h>
1416
#include "lapi/syscalls.h"
@@ -187,4 +189,35 @@ struct uffdio_continue {
187189
#define UFFD_FEATURE_MINOR_SHMEM (1<<10)
188190
#endif /* UFFD_FEATURE_MINOR_SHMEM */
189191

192+
#define SAFE_USERFAULTFD(flags, retry) \
193+
safe_userfaultfd(__FILE__, __LINE__, (flags), (retry))
194+
195+
static inline int safe_userfaultfd(const char *file, const int lineno, int
196+
flags, bool retry)
197+
{
198+
int ret;
199+
200+
retry:
201+
ret = tst_syscall(__NR_userfaultfd, flags);
202+
if (ret == -1) {
203+
if (errno == EPERM) {
204+
if (retry && !(flags & UFFD_USER_MODE_ONLY)) {
205+
flags |= UFFD_USER_MODE_ONLY;
206+
goto retry;
207+
}
208+
tst_res_(file, lineno, TINFO,
209+
"Hint: check /proc/sys/vm/unprivileged_userfaultfd");
210+
tst_brk_(file, lineno, TCONF | TERRNO,
211+
"userfaultfd() requires CAP_SYS_PTRACE on this system");
212+
}
213+
tst_brk_(file, lineno, TBROK | TERRNO,
214+
"syscall(__NR_userfaultfd, %d) failed", flags);
215+
} else if (ret < 0) {
216+
tst_brk_(file, lineno, TBROK | TERRNO,
217+
"Invalid syscall(__NR_userfaultfd, %d) return value %d", flags, ret);
218+
}
219+
220+
return ret;
221+
}
222+
190223
#endif /* LAPI_USERFAULTFD_H__ */

testcases/kernel/security/dirtyc0w_shmem/dirtyc0w_shmem_child.c

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -128,21 +128,8 @@ static void setup_uffd(void)
128128
{
129129
struct uffdio_register uffdio_register;
130130
struct uffdio_api uffdio_api;
131-
int flags = O_CLOEXEC | O_NONBLOCK;
132131

133-
retry:
134-
TEST(tst_syscall(__NR_userfaultfd, flags));
135-
if (TST_RET < 0) {
136-
if (TST_ERR == EPERM) {
137-
if (!(flags & UFFD_USER_MODE_ONLY)) {
138-
flags |= UFFD_USER_MODE_ONLY;
139-
goto retry;
140-
}
141-
}
142-
tst_brk(TBROK | TTERRNO,
143-
"Could not create userfault file descriptor");
144-
}
145-
uffd = TST_RET;
132+
uffd = SAFE_USERFAULTFD(O_CLOEXEC | O_NONBLOCK, true);
146133

147134
uffdio_api.api = UFFD_API;
148135
uffdio_api.features = UFFD_FEATURE_MINOR_SHMEM;

testcases/kernel/syscalls/userfaultfd/userfaultfd01.c

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@ static char *page;
2121
static void *copy_page;
2222
static int uffd;
2323

24-
static int sys_userfaultfd(int flags)
25-
{
26-
return tst_syscall(__NR_userfaultfd, flags);
27-
}
28-
2924
static void set_pages(void)
3025
{
3126
page_size = sysconf(_SC_PAGE_SIZE);
@@ -76,19 +71,8 @@ static void run(void)
7671

7772
set_pages();
7873

79-
TEST(sys_userfaultfd(O_CLOEXEC | O_NONBLOCK));
80-
81-
if (TST_RET == -1) {
82-
if (TST_ERR == EPERM) {
83-
tst_res(TCONF, "Hint: check /proc/sys/vm/unprivileged_userfaultfd");
84-
tst_brk(TCONF | TTERRNO,
85-
"userfaultfd() requires CAP_SYS_PTRACE on this system");
86-
} else
87-
tst_brk(TBROK | TTERRNO,
88-
"Could not create userfault file descriptor");
89-
}
74+
uffd = SAFE_USERFAULTFD(O_CLOEXEC | O_NONBLOCK, false);
9075

91-
uffd = TST_RET;
9276
uffdio_api.api = UFFD_API;
9377
uffdio_api.features = 0;
9478
SAFE_IOCTL(uffd, UFFDIO_API, &uffdio_api);

0 commit comments

Comments
 (0)