From 1747d28e5ada05ec07c4b1d35048ea5b194bde64 Mon Sep 17 00:00:00 2001 From: Robin Gloster Date: Mon, 15 Aug 2016 12:00:51 +0000 Subject: [PATCH] glibc: add patch to fix segfault in forkpty --- pkgs/development/libraries/glibc/common.nix | 3 + .../development/libraries/glibc/forkpty.patch | 75 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 pkgs/development/libraries/glibc/forkpty.patch diff --git a/pkgs/development/libraries/glibc/common.nix b/pkgs/development/libraries/glibc/common.nix index e90fdc4ad7bd..24890e560233 100644 --- a/pkgs/development/libraries/glibc/common.nix +++ b/pkgs/development/libraries/glibc/common.nix @@ -55,6 +55,9 @@ stdenv.mkDerivation ({ ./cve-2016-1234.patch ./cve-2016-3706.patch ./fix_warnings.patch + + # Fixes segfault when calling pty.fork() in python + ./forkpty.patch ]; postPatch = diff --git a/pkgs/development/libraries/glibc/forkpty.patch b/pkgs/development/libraries/glibc/forkpty.patch new file mode 100644 index 000000000000..fe700e5797b6 --- /dev/null +++ b/pkgs/development/libraries/glibc/forkpty.patch @@ -0,0 +1,75 @@ +From f06f3f05b48c72e2c9b0fa78671f94fd22d67da8 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Wed, 1 Jun 2016 07:14:42 +0200 +Subject: [PATCH] fork in libpthread cannot use IFUNC resolver [BZ #19861] + +This commit only addresses the fork case, the vfork case has to be a +tail call, which is why the generic code needs an IFUNC resolver +there. + +diff --git a/nptl/pt-fork.c b/nptl/pt-fork.c +index b65d6b4..db9b61d 100644 +--- a/nptl/pt-fork.c ++++ b/nptl/pt-fork.c +@@ -25,33 +25,14 @@ + 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 __fork and fork symbols in +- libpthread.so; so we define them using IFUNC to redirect to the libc +- function. */ ++ libpthread.so. + +-#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) +- +-# if HAVE_IFUNC +- +-static __typeof (fork) * +-__attribute__ ((used)) +-fork_resolve (void) +-{ +- return &__libc_fork; +-} ++ With an IFUNC resolver, it would be possible to avoid the ++ indirection, but the IFUNC resolver might run before the ++ __libc_fork symbol has been relocated, in which case the IFUNC ++ resolver would not be able to provide the correct address. */ + +-# ifdef HAVE_ASM_SET_DIRECTIVE +-# define DEFINE_FORK(name) \ +- asm (".set " #name ", fork_resolve\n" \ +- ".globl " #name "\n" \ +- ".type " #name ", %gnu_indirect_function"); +-# else +-# define DEFINE_FORK(name) \ +- asm (#name " = fork_resolve\n" \ +- ".globl " #name "\n" \ +- ".type " #name ", %gnu_indirect_function"); +-# endif +- +-# else /* !HAVE_IFUNC */ ++#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_22) + + static pid_t __attribute__ ((used)) + fork_compat (void) +@@ -59,14 +40,10 @@ fork_compat (void) + return __libc_fork (); + } + +-# define DEFINE_FORK(name) strong_alias (fork_compat, name) +- +-# endif /* HAVE_IFUNC */ +- +-DEFINE_FORK (fork_ifunc) +-compat_symbol (libpthread, fork_ifunc, fork, GLIBC_2_0); ++strong_alias (fork_compat, fork_alias) ++compat_symbol (libpthread, fork_alias, fork, GLIBC_2_0); + +-DEFINE_FORK (__fork_ifunc) +-compat_symbol (libpthread, __fork_ifunc, __fork, GLIBC_2_0); ++strong_alias (fork_compat, __fork_alias) ++compat_symbol (libpthread, __fork_alias, __fork, GLIBC_2_0); + + #endif +-- +1.7.1 +