From 60a7ebedc0b53e2cdcea112635a285d8136b68a8 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 15 Nov 2019 10:37:53 +0100 Subject: [PATCH] Add support for setns syscall I've tested this on amd64 and arm but I'm enabling it on all arches since the syscall should work identically on all of them. This was requested by users for a long time (almost 5 years) and in fact, some programs (like libvirt) use namespaces and fork off to enter other namespaces. Lack of implementation means valgrind can't be used with these programs (or their configuration must be changed to not use namespaces, which defeats the purpose). Without knowing it, I've converged to same patch as mentioned in bugs below. https://bugs.kde.org/show_bug.cgi?id=343099 https://bugs.kde.org/show_bug.cgi?id=368923 https://bugs.kde.org/show_bug.cgi?id=369031 Signed-off-by: Michal Privoznik --- NEWS | 3 +++ coregrind/m_syswrap/priv_syswrap-linux.h | 1 + coregrind/m_syswrap/syswrap-amd64-linux.c | 2 +- coregrind/m_syswrap/syswrap-arm-linux.c | 2 +- coregrind/m_syswrap/syswrap-arm64-linux.c | 2 +- coregrind/m_syswrap/syswrap-linux.c | 11 +++++++++++ coregrind/m_syswrap/syswrap-mips32-linux.c | 1 + coregrind/m_syswrap/syswrap-mips64-linux.c | 1 + coregrind/m_syswrap/syswrap-nanomips-linux.c | 1 + coregrind/m_syswrap/syswrap-s390x-linux.c | 2 +- coregrind/m_syswrap/syswrap-x86-linux.c | 2 +- include/vki/vki-scnums-mips32-linux.h | 1 + 12 files changed, 24 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index ef95c3f90f..75491a5b37 100644 --- a/NEWS +++ b/NEWS @@ -86,6 +86,9 @@ To see details of a given bug, visit https://bugs.kde.org/show_bug.cgi?id=XXXXXX where XXXXXX is the bug number as listed below. +343099 Linux setns syscall wrapper missing, unhandled syscall: 308 + == 368923 WARNING: unhandled arm64-linux syscall: 268 (setns) + == 369031 WARNING: unhandled amd64-linux syscall: 308 (setns) 385386 Assertion failed "szB >= CACHE_ENTRY_SIZE" at m_debuginfo/image.c:517 400162 Patch: Guard against __GLIBC_PREREQ for musl libc 400593 In Coregrind, use statx for some internal syscalls if [f]stat[64] fail diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 708e5fda3f..349a97e4d1 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -237,6 +237,7 @@ DECL_TEMPLATE(linux, sys_sched_setaffinity); DECL_TEMPLATE(linux, sys_sched_getaffinity); DECL_TEMPLATE(linux, sys_unshare); +DECL_TEMPLATE(linux, sys_setns); // These ones have different parameters and/or return values on Darwin. // Also, some archs on Linux do not match the generic wrapper for sys_pipe. diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 9b8068d0ff..0aef84af99 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -839,7 +839,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 305 LINX_(__NR_syncfs, sys_syncfs), // 306 LINXY(__NR_sendmmsg, sys_sendmmsg), // 307 -// LINX_(__NR_setns, sys_ni_syscall), // 308 + LINX_(__NR_setns, sys_setns), // 308 LINXY(__NR_getcpu, sys_getcpu), // 309 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 310 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index 3722cdde1a..db7ce10567 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -1005,7 +1005,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 372 LINX_(__NR_syncfs, sys_syncfs), // 373 LINXY(__NR_sendmmsg, sys_sendmmsg), // 374 - + LINX_(__NR_setns, sys_setns), // 375 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 376 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 377 diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c index 017d3a7790..3ae8d86cf9 100644 --- a/coregrind/m_syswrap/syswrap-arm64-linux.c +++ b/coregrind/m_syswrap/syswrap-arm64-linux.c @@ -800,7 +800,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_open_by_handle_at, sys_open_by_handle_at), // 265 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 266 LINX_(__NR_syncfs, sys_syncfs), // 267 - // (__NR_setns, sys_ni_syscall), // 268 + LINX_(__NR_setns, sys_setns), // 268 LINXY(__NR_sendmmsg, sys_sendmmsg), // 269 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 270 LINX_(__NR_process_vm_writev, sys_process_vm_writev), // 271 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 797d65710b..b32bd214ad 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -3772,6 +3772,17 @@ PRE(sys_unshare) PRE_REG_READ1(int, "unshare", unsigned long, flags); } +PRE(sys_setns) +{ + PRINT("sys_setns ( %ld, %ld )", SARG1, SARG2); + PRE_REG_READ2(int, "setns", + int, fd, + int, nstype); + if (!ML_(fd_allowed)(ARG1, "setns", tid, False)) + SET_STATUS_Failure( VKI_EBADF ); +} + + /* --------------------------------------------------------------------- miscellaneous wrappers ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-mips32-linux.c b/coregrind/m_syswrap/syswrap-mips32-linux.c index 477f599216..c70bc21b1d 100644 --- a/coregrind/m_syswrap/syswrap-mips32-linux.c +++ b/coregrind/m_syswrap/syswrap-mips32-linux.c @@ -1090,6 +1090,7 @@ static SyscallTableEntry syscall_main_table[] = { //.. LINXY (__NR_clock_adjtime, sys_clock_adjtime), // 341 LINX_ (__NR_syncfs, sys_syncfs), // 342 + LINX_ (__NR_setns, sys_setns), // 343 //.. LINXY (__NR_process_vm_readv, sys_process_vm_readv), // 345 LINX_ (__NR_process_vm_writev, sys_process_vm_writev), // 346 diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c index b1f548a5fa..f6624bbf6a 100644 --- a/coregrind/m_syswrap/syswrap-mips64-linux.c +++ b/coregrind/m_syswrap/syswrap-mips64-linux.c @@ -809,6 +809,7 @@ static SyscallTableEntry syscall_main_table[] = { LINX_ (__NR_pwritev2, sys_pwritev2), LINX_ (__NR_syncfs, sys_syncfs), LINXY (__NR_statx, sys_statx), + LINX_ (__NR_setns, sys_setns), }; SyscallTableEntry * ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/coregrind/m_syswrap/syswrap-nanomips-linux.c b/coregrind/m_syswrap/syswrap-nanomips-linux.c index 4ab9bccedc..35a11ba387 100644 --- a/coregrind/m_syswrap/syswrap-nanomips-linux.c +++ b/coregrind/m_syswrap/syswrap-nanomips-linux.c @@ -808,6 +808,7 @@ static SyscallTableEntry syscall_main_table[] = { LINXY (__NR_getrandom, sys_getrandom), LINXY (__NR_memfd_create, sys_memfd_create), LINXY (__NR_statx, sys_statx), + LINX_ (__NR_setns, sys_setns), // (__NR_bpf, sys_ni_syscall), // (__NR_execveat, sys_ni_syscall), // (__NR_userfaultfd, sys_ni_syscall), diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c index 3354d41c0f..7655b4bc97 100644 --- a/coregrind/m_syswrap/syswrap-s390x-linux.c +++ b/coregrind/m_syswrap/syswrap-s390x-linux.c @@ -817,7 +817,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_open_by_handle_at, sys_open_by_handle_at), // 336 LINXY(__NR_clock_adjtime, sys_clock_adjtime), // 337 LINX_(__NR_syncfs, sys_syncfs), // 338 -// ?????(__NR_setns, ), // 339 + LINX_(__NR_setns, sys_setns), // 339 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 340 LINX_(__NR_process_vm_writev, sys_process_vm_writev), // 341 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 68d24e1cae..e047e59ed6 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1574,7 +1574,7 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_syncfs, sys_syncfs), // 344 LINXY(__NR_sendmmsg, sys_sendmmsg), // 345 -// LINX_(__NR_setns, sys_ni_syscall), // 346 + LINX_(__NR_setns, sys_setns), // 346 LINXY(__NR_process_vm_readv, sys_process_vm_readv), // 347 LINX_(__NR_process_vm_writev, sys_process_vm_writev),// 348 LINX_(__NR_kcmp, sys_kcmp), // 349 diff --git a/include/vki/vki-scnums-mips32-linux.h b/include/vki/vki-scnums-mips32-linux.h index 544fb01a84..3f3f6f60bf 100644 --- a/include/vki/vki-scnums-mips32-linux.h +++ b/include/vki/vki-scnums-mips32-linux.h @@ -378,6 +378,7 @@ #define __NR_open_by_handle_at (__NR_Linux + 340) #define __NR_clock_adjtime (__NR_Linux + 341) #define __NR_syncfs (__NR_Linux + 342) +#define __NR_setns (__NR_Linux + 343) #define __NR_process_vm_readv (__NR_Linux + 345) #define __NR_process_vm_writev (__NR_Linux + 346) #define __NR_kcmp (__NR_Linux + 347) -- 2.47.3