libunwind: update to 1.3.1.

This commit is contained in:
maxice8 2019-01-12 03:49:12 -02:00 committed by maxice8
parent 5d91b38e30
commit 4f485e3cd1
2 changed files with 4 additions and 75 deletions

View file

@ -1,71 +0,0 @@
From bc8698fd7ed13a629a8ec3cb2a89bd74f9d8b5c0 Mon Sep 17 00:00:00 2001
From: Giuseppe Ottaviano <ott@fb.com>
Date: Sun, 20 Mar 2016 00:28:03 +0000
Subject: [PATCH] x86_64: fix mincore_validate
The detection logic introduced in 28f33c8ce0b654cf31d6beda9a612870662f3c56 is
broken, because it tests mincore using an address that is almost certainly not
page-aligned. straces confirms that msync is used all the time.
This patch fixes the logic by page-aligning the test pointer. strace now shows
that mincore is actually used. Furthermore, the return value of mincore is not
sufficient to assess whether the address can be safely dereferenced: we should
also check that the pages are mapped, through the passed mvec array. This patch
also adds this verification.
Tested on a system where unwinding a stack across a JNI boundary would cause
sporadic segfaults; no more crashes were observed after the patch.
---
src/x86_64/Ginit.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
--- src/x86_64/Ginit.c
+++ src/x86_64/Ginit.c
@@ -30,6 +30,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <config.h>
#endif
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
@@ -81,7 +82,21 @@ static int msync_validate (void *addr, size_t len)
static int mincore_validate (void *addr, size_t len)
{
unsigned char mvec[2]; /* Unaligned access may cross page boundary */
- return mincore (addr, len, mvec);
+ size_t i;
+
+ /* mincore could fail with EAGAIN but we conservatively return -1
+ instead of looping. */
+ if (mincore (addr, len, mvec) != 0)
+ {
+ return -1;
+ }
+
+ for (i = 0; i < (len + PAGE_SIZE - 1) / PAGE_SIZE; i++)
+ {
+ if (!(mvec[i] & 1)) return -1;
+ }
+
+ return 0;
}
#endif
@@ -94,7 +109,12 @@ tdep_init_mem_validate (void)
{
#ifdef HAVE_MINCORE
unsigned char present = 1;
- if (mincore (&present, 1, &present) == 0)
+ unw_word_t addr = PAGE_START((unw_word_t)&present);
+ unsigned char mvec[1];
+ int ret;
+ while ((ret = mincore ((void*)addr, PAGE_SIZE, mvec)) == -1 &&
+ errno == EAGAIN) {}
+ if (ret == 0 && (mvec[0] & 1))
{
Debug(1, "using mincore to validate memory\n");
mem_validate_func = mincore_validate;
--
cgit v1.0

View file

@ -1,6 +1,6 @@
# Template file for 'libunwind'
pkgname=libunwind
version=1.2.1
version=1.3.1
revision=1
build_style=gnu-configure
hostmakedepends="libtool automake"
@ -8,9 +8,9 @@ makedepends="liblzma-devel"
short_desc="Library to determine the call-chain of a program"
maintainer="Juan RP <xtraeme@voidlinux.org>"
license="MIT"
homepage="http://www.nongnu.org/libunwind/"
distfiles="http://download.savannah.gnu.org/releases/$pkgname/$pkgname-${version/rc/-rc}.tar.gz"
checksum=3f3ecb90e28cbe53fba7a4a27ccce7aad188d3210bb1964a923a731a27a75acb
homepage="https://www.nongnu.org/libunwind/"
distfiles="${NONGNU_SITE}/${pkgname}/${pkgname}-${version/rc/-rc}.tar.gz"
checksum=43997a3939b6ccdf2f669b50fdb8a4d3205374728c2923ddc2354c65260214f8
pre_configure() {
sed -i /SUBDIRS/s/tests// Makefile.am