userfaultfd takes a flags argument and returns a file descriptor.
It shows up in the Linux Test Project syscalls tests as unhandled.
Declare a sys_userfaultfd wrapper in priv_syswrap-linux.h and hook it
for {amd64,arm,arm64,mips64,nanomips,ppc32,ppc64,riscv64,s390x,x86}-linux
using LINXY with PRE/POST handlers in syswrap-linux.c.
Define __NR_userfaultfd in vki-scnums-s390x-linux.h. It was already
defined for all other arches.
https://bugs.kde.org/show_bug.cgi?id=501365
501194 Fix ML_(check_macho_and_get_rw_loads) so that it is correct for any number of segment commands
501348 glibc built with -march=x86-64-v3 does not work due to ld.so memcmp
501479 Illumos DRD pthread_mutex_init wrapper errors
+501365 syscall userfaultfd not wrapped
To see details of a given bug, visit
// Linux-specific (new in Linux 4.11)
DECL_TEMPLATE(linux, sys_statx);
+// Linux-specific (new in Linux 4.3)
+DECL_TEMPLATE(linux, sys_userfaultfd);
+
// Linux-specific memory protection key syscalls (since Linux 4.9)
DECL_TEMPLATE(linux, sys_pkey_alloc);
DECL_TEMPLATE(linux, sys_pkey_free);
// LIN__(__NR_kexec_file_load, sys_ni_syscall), // 320
LINXY(__NR_bpf, sys_bpf), // 321
LINX_(__NR_execveat, sys_execveat), // 322
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 323
GENX_(__NR_mlock2, sys_mlock2), // 325
LINX_(__NR_execveat, sys_execveat), // 387
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 388
LINX_(__NR_membarrier, sys_membarrier), // 389
GENX_(__NR_mlock2, sys_mlock2), // 390
LINX_(__NR_copy_file_range, sys_copy_file_range), // 391
LINXY(__NR_memfd_create, sys_memfd_create), // 279
LINXY(__NR_bpf, sys_bpf), // 280
LINX_(__NR_execveat, sys_execveat), // 281
- // (__NR_userfaultfd, sys_ni_syscall), // 282
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 282
LINX_(__NR_membarrier, sys_membarrier), // 283
GENX_(__NR_mlock2, sys_mlock2), // 284
LINX_(__NR_copy_file_range, sys_copy_file_range), // 285
}
}
+/* int syscall(SYS_userfaultfd, int flags); */
+
+PRE(sys_userfaultfd)
+{
+ PRINT("sys_userfaultfd ( %ld )", SARG1);
+ PRE_REG_READ1(long, "userfaultfd", int, size);
+}
+
+POST(sys_userfaultfd)
+{
+ vg_assert(SUCCESS);
+ if (!ML_(fd_allowed)(RES, "userfaultfd", tid, True)) {
+ VG_(close)(RES);
+ SET_STATUS_Failure( VKI_EMFILE );
+ } else {
+ if (VG_(clo_track_fds))
+ ML_(record_fd_open_nameless)(tid, RES);
+ }
+}
+
#undef PRE
#undef POST
LINX_ (__NR_landlock_add_rule, sys_landlock_add_rule),
LINX_ (__NR_landlock_restrict_self, sys_landlock_restrict_self),
LINX_ (__NR_fchmodat2, sys_fchmodat2),
+ LINXY (__NR_userfaultfd, sys_userfaultfd),
};
SyscallTableEntry * ML_(get_linux_syscall_entry) ( UInt sysno )
LINX_ (__NR_setns, sys_setns),
// (__NR_bpf, sys_ni_syscall),
LINX_ (__NR_execveat, sys_execveat),
- // (__NR_userfaultfd, sys_ni_syscall),
+ LINXY (__NR_userfaultfd, sys_userfaultfd),
LINX_ (__NR_membarrier, sys_membarrier),
GENX_ (__NR_mlock2, sys_mlock2),
// (__NR_copy_file_range, sys_ni_syscall),
LINX_ (__NR_execveat, sys_execveat), // 362
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 364
GENX_(__NR_mlock2, sys_mlock2), // 378
LINX_(__NR_copy_file_range, sys_copy_file_range), // 379
LINX_(__NR_preadv2, sys_preadv2), // 380
LINX_(__NR_execveat, sys_execveat), // 362
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 364
LINX_(__NR_membarrier, sys_membarrier), // 365
GENX_(__NR_mlock2, sys_mlock2), // 378
LINXY(__NR_memfd_create, sys_memfd_create), /* 279 */
LINXY(__NR_bpf, sys_bpf), /* 280 */
LINX_(__NR_execveat, sys_execveat), /* 281 */
+ LINXY(__NR_userfaultfd, sys_userfaultfd), /* 282 */
LINX_(__NR_membarrier, sys_membarrier), /* 283 */
GENX_(__NR_mlock2, sys_mlock2), /* 284 */
LINX_(__NR_copy_file_range, sys_copy_file_range), /* 285 */
LINX_(__NR_execveat, sys_execveat), // 354
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 355
LINX_(__NR_membarrier, sys_membarrier), // 356
LINXY(__NR_recvmmsg, sys_recvmmsg), // 357
LINXY(__NR_sendmmsg, sys_sendmmsg), // 358
LINX_(__NR_shutdown, sys_shutdown), // 373
LINX_(__NR_membarrier, sys_membarrier), // 375
+ LINXY(__NR_userfaultfd, sys_userfaultfd), // 374
GENX_(__NR_mlock2, sys_mlock2), // 376
LINX_(__NR_copy_file_range, sys_copy_file_range), // 377
LINXY(__NR_preadv2, sys_preadv2), // 378
#define __NR_execveat 354
+#define __NR_userfaultfd 355
#define __NR_membarrier 356
#define __NR_recvmmsg 357
#define __NR_sendmmsg 358