From: Eugene S. <ev...@gm...> - 2019-03-08 03:22:28
|
As it turned out, the size of vki_siginfo_t is incorrect on these 64-bit architectures: (gdb) p sizeof(vki_siginfo_t) $1 = 136 (gdb) ptype struct vki_siginfo type = struct vki_siginfo { int si_signo; int si_errno; int si_code; union { int _pad[29]; struct {...} _kill; struct {...} _timer; struct {...} _rt; struct {...} _sigchld; struct {...} _sigfault; struct {...} _sigpoll; } _sifields; } It looks like that for this architecture, __VKI_ARCH_SI_PREAMBLE_SIZE hasn't been defined properly, which resulted in incorrect VKI_SI_PAD_SIZE calculation (29 instead of 28). <6a9e4> DW_AT_name : (indirect string, offset: 0xcf59): _sifields <6a9ef> DW_AT_data_member_location: 16 This issue has been discovered with strace's "make check-valgind-memcheck", which produced false out-of-bounds writes on ptrace(PTRACE_GETSIGINFO) calls: SYSCALL[24264,1](101) sys_ptrace ( 16898, 24283, 0x0, 0x606bd40 ) ==24264== Syscall param ptrace(getsiginfo) points to unaddressable byte(s) ==24264== at 0x575C06E: ptrace (ptrace.c:45) ==24264== by 0x443244: next_event (strace.c:2431) ==24264== by 0x443D30: main (strace.c:2845) ==24264== Address 0x606bdc0 is 0 bytes after a block of size 144 alloc'd (Note that the address passed is 0x606bd40 and the address reported is 0x606bdc0). After the patch, no such errors observed. * include/vki/vki-amd64-linux.h [__x86_64__ && __ILP32__] (__vki_kernel_si_clock_t): New typedef. [__x86_64__ && __ILP32__] (__VKI_ARCH_SI_CLOCK_T, __VKI_ARCH_SI_ATTRIBUTES): New macros. [__x86_64__ && !__ILP32__] (__VKI_ARCH_SI_PREAMBLE_SIZE): New macro, define to 4 ints. * include/vki/vki-arm64-linux.h (__VKI_ARCH_SI_PREAMBLE_SIZE): Likewise. * include/vki/vki-ppc64-linux.h [__powerpc64__] (__VKI_ARCH_SI_PREAMBLE_SIZE): Likewise. * include/vki/vki-linux.h [!__VKI_ARCH_SI_CLOCK_T] (__VKI_ARCH_SI_CLOCK_T): New macro, define to vki_clock_t. [!__VKI_ARCH_SI_ATTRIBUTES] (__VKI_ARCH_SI_ATTRIBUTES): New macro, define to nil. (struct vki_siginfo): Use __VKI_ARCH_SI_CLOCK_T type for _utime and _stime fields. Add __VKI_ARCH_SI_ATTRIBUTES. Resolves: https://bugs.kde.org/show_bug.cgi?id=405201 Reported-by: Dmitry V. Levin <ld...@al...> Signed-off-by: Eugene Syromyatnikov <ev...@gm...> --- NEWS | 1 + include/vki/vki-amd64-linux.h | 15 +++++++++++++++ include/vki/vki-arm64-linux.h | 6 ++++++ include/vki/vki-linux.h | 14 +++++++++++--- include/vki/vki-ppc64-linux.h | 8 ++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 0c5d538..bd0e901 100644 --- a/NEWS +++ b/NEWS @@ -104,6 +104,7 @@ where XXXXXX is the bug number as listed below. 403552 s390x: wrong facility bit checked for vector facility 404054 memcheck powerpc subfe x, x, x initializes x to 0 or -1 based on CA 405079 unhandled ppc64le-linux syscall: 131 (quotactl) +405201 Incorrect size of struct vki_siginfo on 64-bit Linux architectures n-i-bz add syswrap for PTRACE_GET|SET_THREAD_AREA on amd64. n-i-bz Fix callgrind_annotate non deterministic order for equal total diff --git a/include/vki/vki-amd64-linux.h b/include/vki/vki-amd64-linux.h index f99dcf8..c2a10e0 100644 --- a/include/vki/vki-amd64-linux.h +++ b/include/vki/vki-amd64-linux.h @@ -300,6 +300,21 @@ struct vki_f_owner_ex { #define VKI_RLIMIT_NOFILE 7 /* max number of open files */ //---------------------------------------------------------------------- +// From linux-5.0.0/arch/x86/include/uapi/asm/siginfo.h +//---------------------------------------------------------------------- + +/* We need that to ensure that sizeof(siginfo) == 128. */ +#ifdef __x86_64__ +# ifdef __ILP32__ +typedef long long __vki_kernel_si_clock_t __attribute__((aligned(4))); +# define __VKI_ARCH_SI_CLOCK_T __vki_kernel_si_clock_t +# define __VKI_ARCH_SI_ATTRIBUTES __attribute__((aligned(8))) +# else +# define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) +# endif +#endif + +//---------------------------------------------------------------------- // From linux-2.6.9/include/asm-x86_64/socket.h //---------------------------------------------------------------------- diff --git a/include/vki/vki-arm64-linux.h b/include/vki/vki-arm64-linux.h index 54b0428..fb26731 100644 --- a/include/vki/vki-arm64-linux.h +++ b/include/vki/vki-arm64-linux.h @@ -196,6 +196,12 @@ struct vki_sigcontext { }; //---------------------------------------------------------------------- +// From linux-5.0.0/arch/arm64/include/uapi/asm/siginfo.h +//---------------------------------------------------------------------- + +#define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) + +//---------------------------------------------------------------------- // From linux-3.10.5/uapi/include/asm-generic/mman-common.h //---------------------------------------------------------------------- diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index b4c6085..9f44a2b 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -428,6 +428,14 @@ typedef union vki_sigval { #define __VKI_ARCH_SI_BAND_T long #endif +#ifndef __VKI_ARCH_SI_CLOCK_T +#define __VKI_ARCH_SI_CLOCK_T vki_clock_t +#endif + +#ifndef __VKI_ARCH_SI_ATTRIBUTES +#define __VKI_ARCH_SI_ATTRIBUTES +#endif + // [[Nb: this type changed between 2.4 and 2.6, but not in a way that // affects Valgrind.]] typedef struct vki_siginfo { @@ -465,8 +473,8 @@ typedef struct vki_siginfo { vki_pid_t _pid; /* which child */ __VKI_ARCH_SI_UID_T _uid; /* sender's uid */ int _status; /* exit code */ - vki_clock_t _utime; - vki_clock_t _stime; + __VKI_ARCH_SI_CLOCK_T _utime; + __VKI_ARCH_SI_CLOCK_T _stime; } _sigchld; /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ @@ -483,7 +491,7 @@ typedef struct vki_siginfo { int _fd; } _sigpoll; } _sifields; -} vki_siginfo_t; +} __VKI_ARCH_SI_ATTRIBUTES vki_siginfo_t; #endif #define __VKI_SI_FAULT 0 diff --git a/include/vki/vki-ppc64-linux.h b/include/vki/vki-ppc64-linux.h index b82dc37..85fcd7b 100644 --- a/include/vki/vki-ppc64-linux.h +++ b/include/vki/vki-ppc64-linux.h @@ -338,6 +338,14 @@ struct vki_sigcontext { }; //---------------------------------------------------------------------- +// From linux-5.0.0/arch/powerpc/include/uapi/asm/siginfo.h +//---------------------------------------------------------------------- + +#ifdef __powerpc64__ +# define __VKI_ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) +#endif + +//---------------------------------------------------------------------- // From linux-2.6.13/include/asm-ppc64/mman.h //---------------------------------------------------------------------- -- 2.1.4 |