[PATCH v7 0/6] ptrace: introduce PTRACE_SET_SYSCALL_INFO API
Dmitry V. Levin
ldv at strace.io
Tue Mar 25 10:41:22 UTC 2025
On Thu, Mar 06, 2025 at 04:02:22AM +0200, Dmitry V. Levin wrote:
> Andrew, could you take this patchset into your tree, please?
>
> It has been under review for almost two months, the last reply was two
> weeks ago, and by now all activity seems to be over. The ptrace maintainer
> approved the ptrace-related patches of this patchset more than a month ago.
> Admittedly, most of architecture maintainers ignored the
> architecture-specific patches from this series, but this is expected,
> so I don't think it's worth waiting for their reaction any longer.
>
> v7: https://lore.kernel.org/all/20250303111910.GA24170@strace.io/
Andrew, could you take this patchset into your tree, please?
Nothing has changed since v7, so I have nothing new to add to the text
written above.
> [trimmed Cc list to save people from irrelevant ping messages.]
>
> On Mon, Mar 03, 2025 at 01:19:10PM +0200, Dmitry V. Levin wrote:
> > PTRACE_SET_SYSCALL_INFO is a generic ptrace API that complements
> > PTRACE_GET_SYSCALL_INFO by letting the ptracer modify details of
> > system calls the tracee is blocked in.
> >
> > This API allows ptracers to obtain and modify system call details in a
> > straightforward and architecture-agnostic way, providing a consistent way
> > of manipulating the system call number and arguments across architectures.
> >
> > As in case of PTRACE_GET_SYSCALL_INFO, PTRACE_SET_SYSCALL_INFO also
> > does not aim to address numerous architecture-specific system call ABI
> > peculiarities, like differences in the number of system call arguments
> > for such system calls as pread64 and preadv.
> >
> > The current implementation supports changing only those bits of system call
> > information that are used by strace system call tampering, namely, syscall
> > number, syscall arguments, and syscall return value.
> >
> > Support of changing additional details returned by PTRACE_GET_SYSCALL_INFO,
> > such as instruction pointer and stack pointer, could be added later if
> > needed, by using struct ptrace_syscall_info.flags to specify the additional
> > details that should be set. Currently, "flags" and "reserved" fields of
> > struct ptrace_syscall_info must be initialized with zeroes; "arch",
> > "instruction_pointer", and "stack_pointer" fields are currently ignored.
> >
> > PTRACE_SET_SYSCALL_INFO currently supports only PTRACE_SYSCALL_INFO_ENTRY,
> > PTRACE_SYSCALL_INFO_EXIT, and PTRACE_SYSCALL_INFO_SECCOMP operations.
> > Other operations could be added later if needed.
> >
> > Ideally, PTRACE_SET_SYSCALL_INFO should have been introduced along with
> > PTRACE_GET_SYSCALL_INFO, but it didn't happen. The last straw that
> > convinced me to implement PTRACE_SET_SYSCALL_INFO was apparent failure
> > to provide an API of changing the first system call argument on riscv
> > architecture [1].
> >
> > ptrace(2) man page:
> >
> > long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
> > ...
> > PTRACE_SET_SYSCALL_INFO
> > Modify information about the system call that caused the stop.
> > The "data" argument is a pointer to struct ptrace_syscall_info
> > that specifies the system call information to be set.
> > The "addr" argument should be set to sizeof(struct ptrace_syscall_info)).
> >
> > [1] https://lore.kernel.org/all/59505464-c84a-403d-972f-d4b2055eeaac@gmail.com/
> >
> > Notes:
> > v7:
> > * csky: Fix typo in comment
> > * mips: syscall_set_arguments: Remove mips_syscall_is_indirect check
> > * mips: syscall_set_nr: Reword comment
> > * mips: Add Reviewed-by
> > * v6: https://lore.kernel.org/all/20250217090834.GA18175@strace.io/
> >
> > v6:
> > * mips: Submit mips_get_syscall_arg() o32 fix via mips tree
> > to get it merged into v6.14-rc3
> > * Rebase to v6.14-rc3
> > * v5: https://lore.kernel.org/all/20250210113336.GA887@strace.io/
> >
> > v5:
> > * ptrace: Extend the commit message to say that the new API does not aim
> > to address numerous architecture-specific syscall ABI peculiarities
> > * selftests: Add a workaround for s390 16-bit syscall numbers
> > * parisc: Add Acked-by
> > * v4: https://lore.kernel.org/all/20250203065849.GA14120@strace.io/
> >
> > v4:
> > * Split out syscall_set_return_value() for hexagon into a separate patch
> > * s390: Change the style of syscall_set_arguments() implementation as
> > requested
> > * ptrace: Add Reviewed-by
> > * v3: https://lore.kernel.org/all/20250128091445.GA8257@strace.io/
> >
> > v3:
> > * powerpc: Submit syscall_set_return_value() fix for "sc" case separately
> > * mips: Do not introduce erroneous argument truncation on mips n32,
> > add a detailed description to the commit message of the
> > mips_get_syscall_arg() change
> > * ptrace: Add explicit padding to the end of struct ptrace_syscall_info,
> > simplify obtaining of user ptrace_syscall_info,
> > do not introduce PTRACE_SYSCALL_INFO_SIZE_VER0
> > * ptrace: Change the return type of ptrace_set_syscall_info_* functions
> > from "unsigned long" to "int"
> > * ptrace: Add -ERANGE check to ptrace_set_syscall_info_exit(),
> > add comments to -ERANGE checks
> > * ptrace: Update comments about supported syscall stops
> > * selftests: Extend set_syscall_info test, fix for mips n32
> > * riscv: Add Tested-by and Reviewed-by
> >
> > v2:
> > * Add patch to fix syscall_set_return_value() on powerpc
> > * Add patch to fix mips_get_syscall_arg() on mips
> > * Add syscall_set_return_value() implementation on hexagon
> > * Add syscall_set_return_value() invocation to syscall_set_nr()
> > on arm and arm64.
> > * Fix syscall_set_nr() and mips_set_syscall_arg() on mips
> > * Add a comment to syscall_set_nr() on arc, powerpc, s390, sh,
> > and sparc
> > * Remove redundant ptrace_syscall_info.op assignments in
> > ptrace_get_syscall_info_*
> > * Minor style tweaks in ptrace_get_syscall_info_op()
> > * Remove syscall_set_return_value() invocation from
> > ptrace_set_syscall_info_entry()
> > * Skip syscall_set_arguments() invocation in case of syscall number -1
> > in ptrace_set_syscall_info_entry()
> > * Split ptrace_syscall_info.reserved into ptrace_syscall_info.reserved
> > and ptrace_syscall_info.flags
> > * Use __kernel_ulong_t instead of unsigned long in set_syscall_info test
> >
> > Dmitry V. Levin (6):
> > hexagon: add syscall_set_return_value()
> > syscall.h: add syscall_set_arguments()
> > syscall.h: introduce syscall_set_nr()
> > ptrace_get_syscall_info: factor out ptrace_get_syscall_info_op
> > ptrace: introduce PTRACE_SET_SYSCALL_INFO request
> > selftests/ptrace: add a test case for PTRACE_SET_SYSCALL_INFO
> >
> > arch/arc/include/asm/syscall.h | 25 +
> > arch/arm/include/asm/syscall.h | 37 ++
> > arch/arm64/include/asm/syscall.h | 29 +
> > arch/csky/include/asm/syscall.h | 13 +
> > arch/hexagon/include/asm/syscall.h | 21 +
> > arch/loongarch/include/asm/syscall.h | 15 +
> > arch/m68k/include/asm/syscall.h | 7 +
> > arch/microblaze/include/asm/syscall.h | 7 +
> > arch/mips/include/asm/syscall.h | 43 ++
> > arch/nios2/include/asm/syscall.h | 16 +
> > arch/openrisc/include/asm/syscall.h | 13 +
> > arch/parisc/include/asm/syscall.h | 19 +
> > arch/powerpc/include/asm/syscall.h | 20 +
> > arch/riscv/include/asm/syscall.h | 16 +
> > arch/s390/include/asm/syscall.h | 21 +
> > arch/sh/include/asm/syscall_32.h | 24 +
> > arch/sparc/include/asm/syscall.h | 22 +
> > arch/um/include/asm/syscall-generic.h | 19 +
> > arch/x86/include/asm/syscall.h | 43 ++
> > arch/xtensa/include/asm/syscall.h | 18 +
> > include/asm-generic/syscall.h | 30 +
> > include/uapi/linux/ptrace.h | 7 +-
> > kernel/ptrace.c | 179 +++++-
> > tools/testing/selftests/ptrace/Makefile | 2 +-
> > .../selftests/ptrace/set_syscall_info.c | 519 ++++++++++++++++++
> > 25 files changed, 1138 insertions(+), 27 deletions(-)
> > create mode 100644 tools/testing/selftests/ptrace/set_syscall_info.c
> >
> >
> > base-commit: 7eb172143d5508b4da468ed59ee857c6e5e01da6
>
> --
> ldv
--
ldv
More information about the Strace-devel
mailing list