From: Bradley Morgan <bradley.morgan@linux.dev>
To: renzo@cs.unibo.it
Cc: akpm@linux-foundation.org, evgsyr@gmail.com, ldv@strace.io,
legion@kernel.org, linux-api@vger.kernel.org,
linux-kernel@vger.kernel.org, oleg@redhat.com,
strace-devel@lists.strace.io, thecharlesjenkins@gmail.com
Subject: Re: [PATCH] ptrace: reject out of range error values in PTRACE_SET_SYSCALL_INFO
Date: Sun, 15 Nov 2026 00:51:33 +0000 [thread overview]
Message-ID: <2D2A202C-35F8-4200-9110-B0E636216FCF@linux.dev> (raw)
In-Reply-To: <20261114184842.373304-1-renzo@cs.unibo.it>
On 14 November 2026 18:48:40 GMT, Renzo Davoli <renzo@cs.unibo.it> wrote:
>When PTRACE_SET_SYSCALL_INFO is used with op == PTRACE_SYSCALL_INFO_EXIT
>and is_error set, info.exit.rval is passed to syscall_set_return_value()
>as its "int error" argument. The only check is that rval fits in a
>"long", which is a no-op on 64-bit architectures, so:
>
> - values outside the "int" range are silently truncated;
> - a value whose low 32 bits are zero, e.g. 0 or 0x100000000, becomes
> error == 0, and the system call returns 0 as a success although the
> tracer asked for an error;
> - a positive value is stored as is by some architectures (e.g. x86)
> and is not seen as an error by the tracee.
>
>PTRACE_GET_SYSCALL_INFO reports errors as negative errno values, so
>reject with -ERANGE any error value outside [-MAX_ERRNO, -1].
>
>Fixes: 26bb32768fe6 ("ptrace: introduce PTRACE_SET_SYSCALL_INFO request")
>Signed-off-by: Renzo Davoli <renzo@cs.unibo.it>
>Assisted-by: claude-opus-5-5
Drop. No longer needed. Annoyingly. Assisted bys aren't needed no more. :(
>---
>This patch is independent of the PTRACE_SET_SYSCALL_INFO syscall skipping
>series and applies cleanly either before or after it.
>
>Tested on x86_64 (QEMU/KVM) with a test program that, at the exit stop of
>getpid(), calls PTRACE_SET_SYSCALL_INFO with op ==
>PTRACE_SYSCALL_INFO_EXIT,
>is_error = 1 and the following rval values:
>
> rval without this patch with this patch
> (getpid() in the tracee)
> 0 returns 0, success -ERANGE
> 1 returns 1, success -ERANGE
> ESRCH (3) returns 3, success -ERANGE
> -MAX_ERRNO - 1 returns -4096, success -ERANGE
> INT_MIN returns INT_MIN, success -ERANGE
> 0x100000000 returns 0, success -ERANGE
> -0x100000000 - ESRCH fails with ESRCH, but -ERANGE
> PTRACE_GET_SYSCALL_INFO
> reports rval -3
> -ESRCH fails with ESRCH fails with ESRCH
> -MAX_ERRNO fails with errno 4095 fails with errno 4095
>
>Without this patch PTRACE_SET_SYSCALL_INFO succeeds in every case, and
>on x86_64 syscall_set_return_value() stores the error, truncated to
>"int", as is: values outside [-MAX_ERRNO, -1] become successful return
>values, so the tracer asks for an error and the tracee sees a success,
>or a different error than the one requested. With this patch these
>values are rejected and the tracee registers are left untouched; valid
>errno values behave as before.
That's just word puke. I did NOT read all of that, make it TL;DR
preferably.
>
> kernel/ptrace.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
>diff --git a/kernel/ptrace.c b/kernel/ptrace.c
>index 3f2fe68ccb14..2fbd0d55b42e 100644
>--- a/kernel/ptrace.c
>+++ b/kernel/ptrace.c
>@@ -1111,6 +1111,14 @@ ptrace_set_syscall_info_exit(struct task_struct *child, struct pt_regs *regs,
> if (rval != info->exit.rval)
> return -ERANGE;
>
>+ /*
>+ * An error is passed to syscall_set_return_value() as an "int"
>+ * and must be a negative errno value: anything else would be
>+ * truncated or would make the system call succeed.
>+ */
This is very verbose. Like VERY verbose. Maybe a one or two liner comment
would be way way better
>+ if (info->exit.is_error && (rval < -MAX_ERRNO || rval >= 0))
>+ return -ERANGE;
>+
> if (info->exit.is_error)
> syscall_set_return_value(child, regs, rval, 0);
> else
>
--- Thanks!
next prev parent reply other threads:[~2026-11-15 0:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-14 18:48 [PATCH] ptrace: reject out of range error values in PTRACE_SET_SYSCALL_INFO Renzo Davoli
2026-11-15 0:51 ` Bradley Morgan [this message]
2026-11-15 8:25 ` [PATCH v2] " Renzo Davoli
2026-11-15 11:26 ` Dmitry V. Levin
2026-11-15 12:14 ` Bradley Morgan
2026-11-15 12:14 ` Bradley Morgan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2D2A202C-35F8-4200-9110-B0E636216FCF@linux.dev \
--to=bradley.morgan@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=evgsyr@gmail.com \
--cc=ldv@strace.io \
--cc=legion@kernel.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=renzo@cs.unibo.it \
--cc=strace-devel@lists.strace.io \
--cc=thecharlesjenkins@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.