qemu-patch-raspberry4/linux-user
Matthias Schiffer 139e5de7c8 linux-user/signal: Map exit signals in SIGCHLD siginfo_t
When converting a siginfo_t from waitid(), the interpretation of si_status
depends on the value of si_code: For CLD_EXITED, it is an exit code and
should be copied verbatim. For other codes, it is a signal number
(possibly with additional high bits from ptrace) that should be mapped.

This code was previously changed in commit 1c3dfb506e
("linux-user/signal: Decode waitid si_code"), but the fix was
incomplete.

Tested with the following test program:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>

    int main() {
    	pid_t pid = fork();
    	if (pid == 0) {
    		exit(12);
    	} else {
    		siginfo_t siginfo = {};
    		waitid(P_PID, pid, &siginfo, WEXITED);
    		printf("Code: %d, status: %d\n", (int)siginfo.si_code, (int)siginfo.si_status);
    	}

    	pid = fork();
    	if (pid == 0) {
    		raise(SIGUSR2);
    	} else {
    		siginfo_t siginfo = {};
    		waitid(P_PID, pid, &siginfo, WEXITED);
    		printf("Code: %d, status: %d\n", (int)siginfo.si_code, (int)siginfo.si_status);
    	}
    }

Output with an x86_64 host and mips64el target before 1c3dfb506e
(incorrect: exit code 12 is translated like a signal):

    Code: 1, status: 17
    Code: 2, status: 17

After 1c3dfb506e (incorrect: signal number is not translated):

    Code: 1, status: 12
    Code: 2, status: 12

With this patch:

    Code: 1, status: 12
    Code: 2, status: 17

Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <81534fde7cdfc6acea4889d886fbefdd606630fb.1635019124.git.mschiffer@universe-factory.net>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
2022-01-06 11:40:52 +01:00
..
aarch64 linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
alpha target/alpha: Implement prctl_unalign_sigbus 2022-01-06 11:40:52 +01:00
arm linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
cris linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
generic linux-user: Add code for PR_GET/SET_UNALIGN 2022-01-06 11:40:52 +01:00
hexagon linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
host linux-user: Fix trivial build error on loongarch64 hosts 2022-01-04 15:16:10 -08:00
hppa target/hppa: Implement prctl_unalign_sigbus 2022-01-06 11:40:52 +01:00
i386 linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
m68k linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
microblaze linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
mips linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
mips64 linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
nios2 linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
openrisc linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
ppc linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
riscv linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
s390x linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
sh4 target/sh4: Implement prctl_unalign_sigbus 2022-01-06 11:40:52 +01:00
sparc linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
x86_64 linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
xtensa linux-user: Split out do_prctl and subroutines 2022-01-06 11:40:52 +01:00
cpu_loop-common.h linux-user: Create special-errno.h 2021-12-19 20:47:33 -08:00
elfload.c linux-user: fix Coverity CID 1464101 2021-11-22 09:17:08 +01:00
errnos.c.inc linux-user: Simplify host <-> target errno conversion using macros 2021-07-12 21:53:35 +02:00
exit.c linux-user: Don't include gdbstub.h in qemu.h 2021-09-13 20:35:45 +02:00
fd-trans.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
fd-trans.h fd-trans: Fix race condition on reallocation of the translation table. 2021-07-12 21:54:46 +02:00
flat.h linux-user/: fix some comment spelling errors 2020-09-17 20:39:22 +02:00
flatload.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
ioctls.h linux-user: implement more loop ioctls 2021-11-29 14:54:17 +01:00
linux_loop.h linux-user: implement more loop ioctls 2021-11-29 14:54:17 +01:00
linuxload.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
loader.h linux-user: Split loader-related prototypes into loader.h 2021-09-13 20:35:44 +02:00
main.c Pull request linux-user 20210916 2021-09-16 21:09:18 +01:00
meson.build meson: Move linux_user_ss to linux-user/ 2021-12-20 10:13:12 -08:00
mmap.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
qemu.h linux-user: Drop unneeded includes from qemu.h 2021-09-13 20:35:45 +02:00
semihost.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
signal-common.h linux-user: Create special-errno.h 2021-12-19 20:47:33 -08:00
signal.c linux-user/signal: Map exit signals in SIGCHLD siginfo_t 2022-01-06 11:40:52 +01:00
socket.h Supply missing header guards 2019-06-12 13:20:21 +02:00
special-errno.h linux-user: Create special-errno.h 2021-12-19 20:47:33 -08:00
strace.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
strace.h linux-user: Split strace prototypes into strace.h 2021-09-13 20:35:44 +02:00
strace.list linux-user: Add copy_file_range to strace.list 2021-05-18 07:09:58 +02:00
syscall.c linux-user: Add code for PR_GET/SET_UNALIGN 2022-01-06 11:40:52 +01:00
syscall_defs.h linux-user/hexagon: Use generic target_stat64 structure 2022-01-06 11:40:52 +01:00
syscall_types.h linux-user: implement more loop ioctls 2021-11-29 14:54:17 +01:00
target_flat.h Supply missing header guards 2019-06-12 13:20:21 +02:00
thunk.c linux-user: Move thunk.c from top-level 2021-12-20 10:12:29 -08:00
trace-events linux-user/trace-events: fix minor typo in format string 2021-06-17 16:09:11 +02:00
trace.h trace: switch position of headers to what Meson requires 2020-08-21 06:18:24 -04:00
uaccess.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
uname.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00
uname.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
user-internals.h linux-user: Mark cpu_loop() with noreturn attribute 2022-01-06 11:40:52 +01:00
user-mmap.h linux-user: Split mmap prototypes into user-mmap.h 2021-09-13 20:35:45 +02:00
vm86.c linux-user: Split linux-user internals out of qemu.h 2021-09-13 20:35:45 +02:00