diff options
author | Robin Gloster <mail@glob.in> | 2016-08-15 12:00:51 +0000 |
---|---|---|
committer | Robin Gloster <mail@glob.in> | 2016-08-16 07:52:03 +0000 |
commit | 1747d28e5ada05ec07c4b1d35048ea5b194bde64 (patch) | |
tree | a2396c4bc1d34cd0589d0333b990c5d0ce45429b /pkgs | |
parent | 99cb230b47756c760b9b1cb5a4b139ddbff50568 (diff) | |
download | nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.tar nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.tar.gz nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.tar.bz2 nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.tar.lz nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.tar.xz nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.tar.zst nixlib-1747d28e5ada05ec07c4b1d35048ea5b194bde64.zip |
glibc: add patch to fix segfault in forkpty
Diffstat (limited to 'pkgs')
-rw-r--r-- | pkgs/development/libraries/glibc/common.nix | 3 | ||||
-rw-r--r-- | pkgs/development/libraries/glibc/forkpty.patch | 75 |
2 files changed, 78 insertions, 0 deletions
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 <fweimer@redhat.com> +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 + |