[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