diff options
author | Patrick Stewart | 2017-09-12 21:24:14 +0100 |
---|---|---|
committer | Patrick Stewart | 2017-09-12 21:24:14 +0100 |
commit | c2192374d6d4aba0c10a6351be8a410e94d2d095 (patch) | |
tree | 501c0cd8c06a4a8c7198775662d6cba3a833be01 /0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch | |
parent | 4063c9486439ef8352123d6b0326dd521b253296 (diff) | |
download | aur-c2192374d6d4aba0c10a6351be8a410e94d2d095.tar.gz |
Update to 2.26-3
Diffstat (limited to '0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch')
-rw-r--r-- | 0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch b/0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch new file mode 100644 index 000000000000..5bd40130dee2 --- /dev/null +++ b/0001-Don-t-use-IFUNC-resolver-for-longjmp-or-system-in-li.patch @@ -0,0 +1,110 @@ +From fc5ad7024c620cdfe9b76e94638aac83b99c5bf8 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab <schwab@suse.de> +Date: Tue, 8 Aug 2017 16:21:58 +0200 +Subject: [PATCH] Don't use IFUNC resolver for longjmp or system in libpthread + (bug 21041) + +Unlike the vfork forwarder and like the fork forwarder as in bug 19861, +there won't be a problem when the compiler does not turn this into a tail +call. +--- + nptl/pt-longjmp.c | 31 ++++++++++--------------------- + nptl/pt-system.c | 24 ++++++++---------------- + 3 files changed, 18 insertions(+), 37 deletions(-) + +diff --git a/nptl/pt-longjmp.c b/nptl/pt-longjmp.c +index 2ef757e687f..8f3c6b3a09f 100644 +--- a/nptl/pt-longjmp.c ++++ b/nptl/pt-longjmp.c +@@ -25,21 +25,14 @@ + symbol in libpthread, but the historical ABI requires it. For static + linking, there is no need to provide anything here--the libc version + will be linked in. For shared library ABI compatibility, there must be +- longjmp and siglongjmp symbols in libpthread.so; so we define them using +- IFUNC to redirect to the libc function. */ ++ longjmp and siglongjmp symbols in libpthread.so. + +-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) +- +-# if HAVE_IFUNC +- +-# undef INIT_ARCH +-# define INIT_ARCH() +-# define DEFINE_LONGJMP(name) libc_ifunc (name, &__libc_longjmp) +- +-extern __typeof(longjmp) longjmp_ifunc; +-extern __typeof(siglongjmp) siglongjmp_ifunc; ++ With an IFUNC resolver, it would be possible to avoid the indirection, ++ but the IFUNC resolver might run before the __libc_longjmp symbol has ++ been relocated, in which case the IFUNC resolver would not be able to ++ provide the correct address. */ + +-# else /* !HAVE_IFUNC */ ++#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) + + static void __attribute__ ((noreturn, used)) + longjmp_compat (jmp_buf env, int val) +@@ -47,14 +40,10 @@ longjmp_compat (jmp_buf env, int val) + __libc_longjmp (env, val); + } + +-# define DEFINE_LONGJMP(name) strong_alias (longjmp_compat, name) +- +-# endif /* HAVE_IFUNC */ +- +-DEFINE_LONGJMP (longjmp_ifunc) +-compat_symbol (libpthread, longjmp_ifunc, longjmp, GLIBC_2_0); ++strong_alias (longjmp_compat, longjmp_alias) ++compat_symbol (libpthread, longjmp_alias, longjmp, GLIBC_2_0); + +-strong_alias (longjmp_ifunc, siglongjmp_ifunc) +-compat_symbol (libpthread, siglongjmp_ifunc, siglongjmp, GLIBC_2_0); ++strong_alias (longjmp_alias, siglongjmp_alias) ++compat_symbol (libpthread, siglongjmp_alias, siglongjmp, GLIBC_2_0); + + #endif +diff --git a/nptl/pt-system.c b/nptl/pt-system.c +index f8ca6ba0d94..b30ddf2b398 100644 +--- a/nptl/pt-system.c ++++ b/nptl/pt-system.c +@@ -25,29 +25,21 @@ + libpthread, but the historical ABI requires it. For static linking, + there is no need to provide anything here--the libc version will be + linked in. For shared library ABI compatibility, there must be a +- 'system' symbol in libpthread.so; so we define it using IFUNC to +- redirect to the libc function. */ ++ 'system' symbol in libpthread.so. + +-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) +- +-# if HAVE_IFUNC +- +-extern __typeof(system) system_ifunc; +-# undef INIT_ARCH +-# define INIT_ARCH() +-libc_ifunc (system_ifunc, &__libc_system) ++ With an IFUNC resolver, it would be possible to avoid the indirection, ++ but the IFUNC resolver might run before the __libc_system symbol has ++ been relocated, in which case the IFUNC resolver would not be able to ++ provide the correct address. */ + +-# else /* !HAVE_IFUNC */ ++#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) + + static int __attribute__ ((used)) + system_compat (const char *line) + { + return __libc_system (line); + } +-strong_alias (system_compat, system_ifunc) +- +-# endif /* HAVE_IFUNC */ +- +-compat_symbol (libpthread, system_ifunc, system, GLIBC_2_0); ++strong_alias (system_compat, system_alias) ++compat_symbol (libpthread, system_alias, system, GLIBC_2_0); + + #endif +-- +2.14.1 + |