From 6504fa50c312a8d2f9610f09ac503f3835a1df83 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 19 Jan 2015 21:52:44 +0000 Subject: [PATCH] Handle the memfd_create system call. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14875 --- NEWS | 1 + coregrind/m_syswrap/priv_syswrap-linux.h | 1 + coregrind/m_syswrap/syswrap-amd64-linux.c | 4 ++-- coregrind/m_syswrap/syswrap-arm-linux.c | 3 ++- coregrind/m_syswrap/syswrap-arm64-linux.c | 1 + coregrind/m_syswrap/syswrap-linux.c | 20 ++++++++++++++++++++ coregrind/m_syswrap/syswrap-mips32-linux.c | 3 ++- coregrind/m_syswrap/syswrap-mips64-linux.c | 3 ++- coregrind/m_syswrap/syswrap-ppc32-linux.c | 3 ++- coregrind/m_syswrap/syswrap-ppc64-linux.c | 3 ++- coregrind/m_syswrap/syswrap-s390x-linux.c | 4 ++-- coregrind/m_syswrap/syswrap-x86-linux.c | 4 ++-- 12 files changed, 39 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index 6f693fbbee..1e6cb3a974 100644 --- a/NEWS +++ b/NEWS @@ -103,6 +103,7 @@ where XXXXXX is the bug number as listed below. 342063 wrong format specifier for test mcblocklistsearch in gdbserver_tests 342221 socket connect false positive uninit memory for unknown af family 342795 Internal glibc __GI_mempcpy call should be intercepted +343012 Unhandled syscall 319 (memfd_create) n-i-bz Provide implementations of certain compiler builtins to support compilers who may not provide those n-i-bz Old STABS code is still being compiled, but never used. Remove it. diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 22c6c983d9..4a8d7e17d5 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -285,6 +285,7 @@ DECL_TEMPLATE(linux, sys_fanotify_mark); // Linux-specific (new in Linux 3.17) DECL_TEMPLATE(linux, sys_getrandom); +DECL_TEMPLATE(linux, sys_memfd_create); /* --------------------------------------------------------------------- Wrappers for sockets and ipc-ery. These are split into standalone diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index ae696b1c30..88802fba88 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -1078,8 +1078,8 @@ static SyscallTableEntry syscall_table[] = { // LIN__(__NR_sched_getattr, sys_ni_syscall), // 315 // LIN__(__NR_renameat2, sys_ni_syscall), // 316 // LIN__(__NR_seccomp, sys_ni_syscall), // 317 - LINXY(__NR_getrandom, sys_getrandom) // 318 -// LIN__(__NR_memfd_create, sys_ni_syscall), // 319 + LINXY(__NR_getrandom, sys_getrandom), // 318 + LINXY(__NR_memfd_create, sys_memfd_create) // 319 // LIN__(__NR_kexec_file_load, sys_ni_syscall), // 320 // LIN__(__NR_bpf, sys_ni_syscall) // 321 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index 4293800602..200b0d177c 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -1215,7 +1215,8 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 371 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 372 LINXY(__NR_sendmmsg, sys_sendmmsg), // 374 - LINXY(__NR_getrandom, sys_getrandom) // 384 + LINXY(__NR_getrandom, sys_getrandom), // 384 + LINXY(__NR_memfd_create, sys_memfd_create) // 385 }; diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index 56fafac4c3..a72392fd94 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -1037,6 +1037,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 270 LINX_(__NR_process_vm_writev, sys_process_vm_writev), // 271 LINXY(__NR_getrandom, sys_getrandom), // 278 + LINXY(__NR_memfd_create, sys_memfd_create), // 279 // The numbers below are bogus. (See comment further down.) // When pulling entries above this line, change the numbers diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index f0bd3cbbea..7c7254515c 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -3018,6 +3018,26 @@ POST(sys_getrandom) POST_MEM_WRITE( ARG1, ARG2 ); } +PRE(sys_memfd_create) +{ + PRINT("sys_memfd_create ( %#lx, %ld )" , ARG1,ARG2); + PRE_REG_READ2(int, "memfd_create", + char *, uname, unsigned int, flags); + PRE_MEM_RASCIIZ( "memfd_create(uname)", ARG1 ); +} + +POST(sys_memfd_create) +{ + vg_assert(SUCCESS); + if (!ML_(fd_allowed)(RES, "memfd_create", tid, True)) { + VG_(close)(RES); + SET_STATUS_Failure( VKI_EMFILE ); + } else { + if (VG_(clo_track_fds)) + ML_(record_fd_open_nameless)(tid, RES); + } +} + /* --------------------------------------------------------------------- utime wrapper ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index bddadd0168..fa921c1d6c 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -1118,7 +1118,8 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_process_vm_readv, sys_process_vm_readv), // 345 LINX_ (__NR_process_vm_writev, sys_process_vm_writev), // 346 //.. - LINXY(__NR_getrandom, sys_getrandom) // 353 + LINXY(__NR_getrandom, sys_getrandom), // 353 + LINXY(__NR_memfd_create, sys_memfd_create) // 354 }; SyscallTableEntry* ML_(get_linux_syscall_entry) (UInt sysno) diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index c51ab6fb21..f8340ab81e 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -910,7 +910,8 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_clock_adjtime, sys_clock_adjtime), LINXY (__NR_process_vm_readv, sys_process_vm_readv), LINX_ (__NR_process_vm_writev, sys_process_vm_writev), - LINXY(__NR_getrandom, sys_getrandom) + LINXY(__NR_getrandom, sys_getrandom), + LINXY(__NR_memfd_create, sys_memfd_create) }; SyscallTableEntry * ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index 5c058c2815..6b53abe52c 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -1258,7 +1258,8 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352 - LINXY(__NR_getrandom, sys_getrandom) // 359 + LINXY(__NR_getrandom, sys_getrandom), // 359 + LINXY(__NR_memfd_create, sys_memfd_create) // 360 }; SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index c173593439..25e0bdecdb 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -1157,7 +1157,8 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 351 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 352 - LINXY(__NR_getrandom, sys_getrandom) // 359 + LINXY(__NR_getrandom, sys_getrandom), // 359 + LINXY(__NR_memfd_create, sys_memfd_create) // 360 }; SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 6363e2de79..ca969c870e 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -1050,9 +1050,9 @@ static SyscallTableEntry syscall_table[] = { // ?????(__NR_sched_getattr, ), // 346 // ?????(__NR_renameat2, ), // 347 // ?????(__NR_seccomp, ), // 348 - LINXY(__NR_getrandom, sys_getrandom) // 349 + LINXY(__NR_getrandom, sys_getrandom), // 349 -// ?????(__NR_memfd_create, ), // 350 + LINXY(__NR_memfd_create, sys_memfd_create) // 350 }; SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index dcbf4251e3..0e8767933c 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1821,8 +1821,8 @@ static SyscallTableEntry syscall_table[] = { // LIN__(__NR_renameat2, sys_ni_syscall), // 353 // LIN__(__NR_seccomp, sys_ni_syscall), // 354 - LINXY(__NR_getrandom, sys_getrandom) // 355 -// LIN__(__NR_memfd_create, sys_ni_syscall), // 356 + LINXY(__NR_getrandom, sys_getrandom), // 355 + LINXY(__NR_memfd_create, sys_memfd_create) // 356 // LIN__(__NR_bpf, sys_ni_syscall) // 357 }; -- 2.47.3