diff --git a/valgrind-3.15.0-ptrace-siginfo.patch b/valgrind-3.15.0-ptrace-siginfo.patch new file mode 100644 index 0000000..0276762 --- /dev/null +++ b/valgrind-3.15.0-ptrace-siginfo.patch @@ -0,0 +1,170 @@ +commit 3bac39a10abf292d332bb20ab58c6dd5c28f9108 +Author: Eugene Syromyatnikov +Date: Fri Mar 8 04:07:00 2019 +0100 + + include/vki: fix vki_siginfo_t definition on amd64, arm64, and ppc64 + + 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-valgrind-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 + Signed-off-by: Eugene Syromyatnikov + +diff --git a/include/vki/vki-amd64-linux.h b/include/vki/vki-amd64-linux.h +index d6a5a77e6..fbd353aed 100644 +--- a/include/vki/vki-amd64-linux.h ++++ b/include/vki/vki-amd64-linux.h +@@ -297,6 +297,21 @@ struct vki_f_owner_ex { + #define VKI_RLIMIT_CORE 4 /* max core file size */ + #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 ecea8cc78..69fb3ed00 100644 +--- a/include/vki/vki-arm64-linux.h ++++ b/include/vki/vki-arm64-linux.h +@@ -193,6 +193,12 @@ struct vki_sigcontext { + __vki_u8 __reserved[4096] __attribute__((__aligned__(16))); + }; + ++//---------------------------------------------------------------------- ++// 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 6024f2165..6903c77db 100644 +--- a/include/vki/vki-linux.h ++++ b/include/vki/vki-linux.h +@@ -426,6 +426,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 { +@@ -463,8 +471,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 */ +@@ -481,7 +489,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 a5e64dd39..04f72048a 100644 +--- a/include/vki/vki-ppc64-linux.h ++++ b/include/vki/vki-ppc64-linux.h +@@ -335,6 +335,14 @@ struct vki_sigcontext { + long vmx_reserve[VKI_ELF_NVRREG+VKI_ELF_NVRREG+1]; + }; + ++//---------------------------------------------------------------------- ++// 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 + //---------------------------------------------------------------------- diff --git a/valgrind.spec b/valgrind.spec index da0cf24..e9ade37 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -3,7 +3,7 @@ Summary: Tool for finding memory management bugs in programs Name: %{?scl_prefix}valgrind Version: 3.15.0 -Release: 11%{?dist} +Release: 12%{?dist} Epoch: 1 License: GPLv2+ URL: http://www.valgrind.org/ @@ -133,6 +133,9 @@ Patch18: valgrind-3.15.0-arm-membarrier.patch # KDE#404406 s390x: z14 miscellaneous instructions not implemented Patch19: valgrind-3.15.0-z14-misc.patch +# KDE#405201 Incorrect size of struct vki_siginfo on 64-bit Linux architectures +Patch20: valgrind-3.15.0-ptrace-siginfo.patch + BuildRequires: glibc-devel %if %{build_openmpi} @@ -288,6 +291,8 @@ Valgrind User Manual for details. %patch19 -p1 %endif +%patch20 -p1 + %build # Some patches (might) touch Makefile.am or configure.ac files. @@ -507,6 +512,9 @@ fi %endif %changelog +* Mon Sep 23 2019 Mark Wielaard - 3.15.0-12 +- Add valgrind-3.15.0-ptrace-siginfo.patch + * Mon Aug 5 2019 Mark Wielaard - 3.15.0-11 - Add valgrind-3.15.0-preadv2-pwritev2.patch - Add valgrind-3.15.0-arm-membarrier.patch