From c98ac3f815e3f7c52963c75c2ae39589fdcf35dd Mon Sep 17 00:00:00 2001 From: Kevin Mihelich Date: Tue, 15 Mar 2016 18:14:30 +0000 Subject: [PATCH] extra/valgrind to 3.11.0-3 --- extra/valgrind/PKGBUILD | 15 +++- extra/valgrind/fix_rlimit.patch | 140 ++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 extra/valgrind/fix_rlimit.patch diff --git a/extra/valgrind/PKGBUILD b/extra/valgrind/PKGBUILD index 41280ac24..243ff86d9 100644 --- a/extra/valgrind/PKGBUILD +++ b/extra/valgrind/PKGBUILD @@ -6,11 +6,11 @@ # - hold for toolchain update, only build for v7/v8 buildarch=12 -noautobuild=1 +#noautobuild=1 pkgname=valgrind pkgver=3.11.0 -pkgrel=2 +pkgrel=3 pkgdesc='A tool to help find memory-management problems in programs' arch=(i686 x86_64) license=(GPL) @@ -20,8 +20,15 @@ makedepends=(gdb openmpi) optdepends=('openmpi: MPI support') # valgrind does not like stack protector flags options=(!emptydirs) -source=(http://valgrind.org/downloads/$pkgname-$pkgver.tar.bz2) -sha1sums=('340757e91d9e83591158fe8bb985c6b11bc53de5') +source=(http://valgrind.org/downloads/$pkgname-$pkgver.tar.bz2 + fix_rlimit.patch) +sha1sums=('340757e91d9e83591158fe8bb985c6b11bc53de5' + 'df0e8eb9ff28d4ae5aa1e360de9c6616d1268c63') + +prepare() { + cd $pkgname-$pkgver + patch -p0 < ../fix_rlimit.patch # https://bugzilla.redhat.com/show_bug.cgi?id=1301093 +} build() { CFLAGS=${CFLAGS/-fstack-protector/} # remove stack protector flag diff --git a/extra/valgrind/fix_rlimit.patch b/extra/valgrind/fix_rlimit.patch new file mode 100644 index 000000000..094fe882a --- /dev/null +++ b/extra/valgrind/fix_rlimit.patch @@ -0,0 +1,140 @@ +------------------------------------------------------------------------ +r15766 | mjw | 2016-01-21 03:37:43 -0800 (Thu, 21 Jan 2016) | 13 lines +Changed paths: + M /trunk/NEWS + M /trunk/coregrind/m_libcproc.c + M /trunk/coregrind/m_main.c + M /trunk/coregrind/m_syswrap/syswrap-generic.c + M /trunk/coregrind/m_syswrap/syswrap-solaris.c + +Bug #357833 Setting RLIMIT_DATA to zero breaks with linux 4.5+ + +We used to set the process datasize rlimit to zero to prevent +any internal use of brk() from having any effect. But later +linux kernels redefine RLIMIT_DATA as the size of any data +areas, including some dynamic mmap memory allocations. + +See bug #357833 for the commit that went into linux 4.5 +changing the definition of RLIMIT_DATA. So don't mess with +RLIMIT_DATA anymore. Just remember it for use in the syscall +wrappers. + +This also cleans up some hacks around the execv and spawn wrappers. +------------------------------------------------------------------------ +Index: coregrind/m_syswrap/syswrap-generic.c +=================================================================== +--- coregrind/m_syswrap/syswrap-generic.c (revision 15765) ++++ coregrind/m_syswrap/syswrap-generic.c (revision 15766) +@@ -3014,9 +3014,6 @@ + vg_assert(j == tot_args+1); + } + +- /* restore the DATA rlimit for the child */ +- VG_(setrlimit)(VKI_RLIMIT_DATA, &VG_(client_rlimit_data)); +- + /* + Set the signal state up for exec. + +Index: coregrind/m_syswrap/syswrap-solaris.c +=================================================================== +--- coregrind/m_syswrap/syswrap-solaris.c (revision 15765) ++++ coregrind/m_syswrap/syswrap-solaris.c (revision 15766) +@@ -1589,10 +1589,6 @@ + #undef COPY_CHAR_TO_ARGENV + #undef COPY_STRING_TOARGENV + +- /* HACK: Temporarily restore the DATA rlimit for spawned child. +- This is a terrible hack to provide sensible brk limit for child. */ +- VG_(setrlimit)(VKI_RLIMIT_DATA, &VG_(client_rlimit_data)); +- + /* Actual spawn() syscall. */ + SysRes res = VG_(do_syscall5)(__NR_spawn, (UWord) path, (UWord) attrs, + attrs_size, (UWord) argenv, argenv_size); +@@ -1599,11 +1595,6 @@ + SET_STATUS_from_SysRes(res); + VG_(free)(argenv); + +- /* Restore DATA rlimit back to its previous value set in m_main.c. */ +- struct vki_rlimit zero = { 0, 0 }; +- zero.rlim_max = VG_(client_rlimit_data).rlim_max; +- VG_(setrlimit)(VKI_RLIMIT_DATA, &zero); +- + if (SUCCESS) { + PRINT(" spawn: process %d spawned child %ld\n", VG_(getpid)(), RES); + } +@@ -3794,9 +3785,6 @@ + VG_(sigprocmask)(VKI_SIG_SETMASK, &tst->sig_mask, NULL); + } + +- /* Restore the DATA rlimit for the child. */ +- VG_(setrlimit)(VKI_RLIMIT_DATA, &VG_(client_rlimit_data)); +- + /* Debug-only printing. */ + if (0) { + HChar **cpp; +Index: coregrind/m_main.c +=================================================================== +--- coregrind/m_main.c (revision 15765) ++++ coregrind/m_main.c (revision 15766) +@@ -1627,7 +1627,6 @@ + Bool logging_to_fd = False; + const HChar* xml_fname_unexpanded = NULL; + Int loglevel, i; +- struct vki_rlimit zero = { 0, 0 }; + XArray* addr2dihandle = NULL; + + //============================================================ +@@ -1800,13 +1799,15 @@ + VG_(debugLog)(1, "main", "... %s\n", VG_(name_of_launcher)); + + //-------------------------------------------------------------- +- // Get the current process datasize rlimit, and set it to zero. +- // This prevents any internal uses of brk() from having any effect. +- // We remember the old value so we can restore it on exec, so that +- // child processes will have a reasonable brk value. ++ // We used to set the process datasize rlimit to zero to prevent ++ // any internal use of brk() from having any effect. But later ++ // linux kernels redefine RLIMIT_DATA as the size of any data ++ // areas, including some dynamic mmap memory allocations. ++ // See bug #357833 for the commit that went into linux 4.5 ++ // changing the definition of RLIMIT_DATA. So don't mess with ++ // RLIMIT_DATA here now anymore. Just remember it for use in ++ // the syscall wrappers. + VG_(getrlimit)(VKI_RLIMIT_DATA, &VG_(client_rlimit_data)); +- zero.rlim_max = VG_(client_rlimit_data).rlim_max; +- VG_(setrlimit)(VKI_RLIMIT_DATA, &zero); + + // Get the current process stack rlimit. + VG_(getrlimit)(VKI_RLIMIT_STACK, &VG_(client_rlimit_stack)); +Index: coregrind/m_libcproc.c +=================================================================== +--- coregrind/m_libcproc.c (revision 15765) ++++ coregrind/m_libcproc.c (revision 15766) +@@ -450,9 +450,6 @@ + HChar** envp; + SysRes res; + +- /* restore the DATA rlimit for the child */ +- VG_(setrlimit)(VKI_RLIMIT_DATA, &VG_(client_rlimit_data)); +- + envp = VG_(env_clone)(VG_(client_envp)); + VG_(env_remove_valgrind_env_stuff)( envp, True /*ro_strings*/, NULL ); + +@@ -511,17 +508,9 @@ + # undef COPY_CHAR_TO_ARGENV + # undef COPY_STRING_TOARGENV + +- /* HACK: Temporarily restore the DATA rlimit for spawned child. */ +- VG_(setrlimit)(VKI_RLIMIT_DATA, &VG_(client_rlimit_data)); +- + SysRes res = VG_(do_syscall5)(__NR_spawn, (UWord) filename, (UWord) NULL, 0, + (UWord) argenv, argenv_size); + +- /* Restore DATA rlimit back to its previous value set in m_main.c. */ +- struct vki_rlimit zero = { 0, 0 }; +- zero.rlim_max = VG_(client_rlimit_data).rlim_max; +- VG_(setrlimit)(VKI_RLIMIT_DATA, &zero); +- + VG_(free)(argenv); + for (HChar **p = envp; *p != NULL; p++) { + VG_(free)(*p);