Revision 61bf318eac2c13356f7bd1c6a05421ef504ccc8a authored by Sergei Trofimovich on 13 March 2021, 05:08:27 UTC, committed by Linus Torvalds on 13 March 2021, 19:27:31 UTC
In https://bugs.gentoo.org/769614 Dmitry noticed that
`ptrace(PTRACE_GET_SYSCALL_INFO)` does not return error sign properly.

The bug is in mismatch between get/set errors:

static inline long syscall_get_error(struct task_struct *task,
                                     struct pt_regs *regs)
{
        return regs->r10 == -1 ? regs->r8:0;
}

static inline long syscall_get_return_value(struct task_struct *task,
                                            struct pt_regs *regs)
{
        return regs->r8;
}

static inline void syscall_set_return_value(struct task_struct *task,
                                            struct pt_regs *regs,
                                            int error, long val)
{
        if (error) {
                /* error < 0, but ia64 uses > 0 return value */
                regs->r8 = -error;
                regs->r10 = -1;
        } else {
                regs->r8 = val;
                regs->r10 = 0;
        }
}

Tested on v5.10 on rx3600 machine (ia64 9040 CPU).

Link: https://lkml.kernel.org/r/20210221002554.333076-2-slyfox@gentoo.org
Link: https://bugs.gentoo.org/769614
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Reported-by: Dmitry V. Levin <ldv@altlinux.org>
Reviewed-by: Dmitry V. Levin <ldv@altlinux.org>
Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Cc: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 0ceb1ac
History
File Mode Size
cluster
dlm
dlmfs
Kconfig -rw-r--r-- 2.5 KB
Makefile -rw-r--r-- 1.0 KB
acl.c -rw-r--r-- 9.2 KB
acl.h -rw-r--r-- 819 bytes
alloc.c -rw-r--r-- 196.2 KB
alloc.h -rw-r--r-- 11.2 KB
aops.c -rw-r--r-- 62.0 KB
aops.h -rw-r--r-- 2.4 KB
blockcheck.c -rw-r--r-- 15.2 KB
blockcheck.h -rw-r--r-- 3.3 KB
buffer_head_io.c -rw-r--r-- 11.1 KB
buffer_head_io.h -rw-r--r-- 1.6 KB
dcache.c -rw-r--r-- 12.5 KB
dcache.h -rw-r--r-- 1.2 KB
dir.c -rw-r--r-- 113.3 KB
dir.h -rw-r--r-- 3.2 KB
dlmglue.c -rw-r--r-- 125.2 KB
dlmglue.h -rw-r--r-- 6.7 KB
export.c -rw-r--r-- 6.2 KB
export.h -rw-r--r-- 392 bytes
extent_map.c -rw-r--r-- 23.5 KB
extent_map.h -rw-r--r-- 2.3 KB
file.c -rw-r--r-- 66.6 KB
file.h -rw-r--r-- 2.4 KB
filecheck.c -rw-r--r-- 12.0 KB
filecheck.h -rw-r--r-- 1.9 KB
heartbeat.c -rw-r--r-- 2.8 KB
heartbeat.h -rw-r--r-- 828 bytes
inode.c -rw-r--r-- 45.4 KB
inode.h -rw-r--r-- 5.3 KB
ioctl.c -rw-r--r-- 22.4 KB
ioctl.h -rw-r--r-- 369 bytes
journal.c -rw-r--r-- 61.8 KB
journal.h -rw-r--r-- 21.5 KB
localalloc.c -rw-r--r-- 33.3 KB
localalloc.h -rw-r--r-- 1.5 KB
locks.c -rw-r--r-- 2.8 KB
locks.h -rw-r--r-- 471 bytes
mmap.c -rw-r--r-- 4.3 KB
mmap.h -rw-r--r-- 173 bytes
move_extents.c -rw-r--r-- 25.2 KB
move_extents.h -rw-r--r-- 363 bytes
namei.c -rw-r--r-- 69.5 KB
namei.h -rw-r--r-- 1.1 KB
ocfs1_fs_compat.h -rw-r--r-- 2.3 KB
ocfs2.h -rw-r--r-- 24.7 KB
ocfs2_fs.h -rw-r--r-- 49.6 KB
ocfs2_ioctl.h -rw-r--r-- 6.5 KB
ocfs2_lockid.h -rw-r--r-- 2.7 KB
ocfs2_lockingver.h -rw-r--r-- 562 bytes
ocfs2_trace.h -rw-r--r-- 75.8 KB
quota.h -rw-r--r-- 4.6 KB
quota_global.c -rw-r--r-- 29.8 KB
quota_local.c -rw-r--r-- 35.5 KB
refcounttree.c -rw-r--r-- 120.3 KB
refcounttree.h -rw-r--r-- 4.4 KB
reservations.c -rw-r--r-- 19.9 KB
reservations.h -rw-r--r-- 4.9 KB
resize.c -rw-r--r-- 15.5 KB
resize.h -rw-r--r-- 444 bytes
slot_map.c -rw-r--r-- 11.8 KB
slot_map.h -rw-r--r-- 769 bytes
stack_o2cb.c -rw-r--r-- 11.2 KB
stack_user.c -rw-r--r-- 28.9 KB
stackglue.c -rw-r--r-- 17.0 KB
stackglue.h -rw-r--r-- 8.8 KB
suballoc.c -rw-r--r-- 74.8 KB
suballoc.h -rw-r--r-- 6.9 KB
super.c -rw-r--r-- 69.0 KB
super.h -rw-r--r-- 911 bytes
symlink.c -rw-r--r-- 2.5 KB
symlink.h -rw-r--r-- 634 bytes
sysfile.c -rw-r--r-- 4.1 KB
sysfile.h -rw-r--r-- 416 bytes
uptodate.c -rw-r--r-- 17.0 KB
uptodate.h -rw-r--r-- 2.3 KB
xattr.c -rw-r--r-- 193.0 KB
xattr.h -rw-r--r-- 3.1 KB

back to top