On Fri, Apr 16, 2021 at 03:55:32PM +0800, He Zhe wrote: > Add sign extension handling in syscall_get_return_value so that it can > handle 32-bit compatible case and can be used by for example audit, just > like what syscall_get_error does.
If a compat syscall can ever legitimately return a non-error value with bit 31 set, and this sign-extends it, is that ever going to reach userspace as a 64-bit value? IIUC things like mmap() can return pointers above 2GiB for a compat task, so I'm a bit uneasy that we'd handle those wrong. I can't see a way of preventing that unless we keep the upper 32 bits for errors. Mark. > > Signed-off-by: He Zhe <zhe...@windriver.com> > --- > arch/arm64/include/asm/syscall.h | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/syscall.h > b/arch/arm64/include/asm/syscall.h > index cfc0672013f6..cd7a22787aeb 100644 > --- a/arch/arm64/include/asm/syscall.h > +++ b/arch/arm64/include/asm/syscall.h > @@ -44,7 +44,12 @@ static inline long syscall_get_error(struct task_struct > *task, > static inline long syscall_get_return_value(struct task_struct *task, > struct pt_regs *regs) > { > - return regs->regs[0]; > + long val = regs->regs[0]; > + > + if (is_compat_thread(task_thread_info(task))) > + val = sign_extend64(val, 31); > + > + return val; > } > > static inline void syscall_set_return_value(struct task_struct *task, > -- > 2.17.1 > -- Linux-audit mailing list Linux-audit@redhat.com https://listman.redhat.com/mailman/listinfo/linux-audit