diff --git a/0001-Revert-elf-Refuse-to-dlopen-PIE-objects-BZ-24323.patch b/0001-Revert-elf-Refuse-to-dlopen-PIE-objects-BZ-24323.patch new file mode 100644 index 0000000..1685609 --- /dev/null +++ b/0001-Revert-elf-Refuse-to-dlopen-PIE-objects-BZ-24323.patch @@ -0,0 +1,150 @@ +From aafd1ef00c51824b7cc3b11bf24317400d2289ed Mon Sep 17 00:00:00 2001 +From: Matti Kosola +Date: Sun, 2 Feb 2020 10:57:54 +0200 +Subject: [PATCH] Revert "elf: Refuse to dlopen PIE objects [BZ #24323]" + +This reverts commit 2c75b545de6fe3c44138799c68217a94bc669a88. +--- + elf/Makefile | 4 +--- + elf/dl-load.c | 18 ++++------------ + elf/tst-dlopen-pie.c | 49 -------------------------------------------- + include/elf.h | 2 +- + 4 files changed, 6 insertions(+), 67 deletions(-) + delete mode 100644 elf/tst-dlopen-pie.c + +diff --git a/elf/Makefile b/elf/Makefile +index a3eefd1b1f..bc3e092e5a 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -312,7 +312,7 @@ test-xfail-tst-protected1b = yes + endif + ifeq (yesyes,$(have-fpie)$(build-shared)) + modules-names += tst-piemod1 +-tests += tst-pie1 tst-pie2 tst-dlopen-pie ++tests += tst-pie1 tst-pie2 + tests-pie += tst-pie1 tst-pie2 + ifeq (yes,$(have-protected-data)) + tests += vismain +@@ -1086,8 +1086,6 @@ CFLAGS-tst-pie2.c += $(pie-ccflag) + + $(objpfx)tst-piemod1.so: $(libsupport) + $(objpfx)tst-pie1: $(objpfx)tst-piemod1.so +-$(objpfx)tst-dlopen-pie: $(libdl) +-$(objpfx)tst-dlopen-pie.out: $(objpfx)tst-pie1 + + ifeq (yes,$(build-shared)) + # NB: Please keep cet-built-dso in sysdeps/x86/Makefile in sync with +diff --git a/elf/dl-load.c b/elf/dl-load.c +index 5abeb867f1..2bbef81b6e 100644 +--- a/elf/dl-load.c ++++ b/elf/dl-load.c +@@ -1158,10 +1158,6 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, + goto call_lose; + } + +- /* dlopen of an executable is not valid because it is not possible +- to perform proper relocations, handle static TLS, or run the +- ELF constructors. For PIE, the check needs the dynamic +- section, so there is another check below. */ + if (__glibc_unlikely (type != ET_DYN) + && __glibc_unlikely ((mode & __RTLD_OPENEXEC) == 0)) + { +@@ -1198,11 +1194,9 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, + elf_get_dynamic_info (l, NULL); + + /* Make sure we are not dlopen'ing an object that has the +- DF_1_NOOPEN flag set, or a PIE object. */ +- if ((__glibc_unlikely (l->l_flags_1 & DF_1_NOOPEN) +- && (mode & __RTLD_DLOPEN)) +- || (__glibc_unlikely (l->l_flags_1 & DF_1_PIE) +- && __glibc_unlikely ((mode & __RTLD_OPENEXEC) == 0))) ++ DF_1_NOOPEN flag set. */ ++ if (__glibc_unlikely (l->l_flags_1 & DF_1_NOOPEN) ++ && (mode & __RTLD_DLOPEN)) + { + /* We are not supposed to load this object. Free all resources. */ + _dl_unmap_segments (l); +@@ -1213,11 +1207,7 @@ _dl_map_object_from_fd (const char *name, const char *origname, int fd, + if (l->l_phdr_allocated) + free ((void *) l->l_phdr); + +- if (l->l_flags_1 & DF_1_PIE) +- errstring +- = N_("cannot dynamically load position-independent executable"); +- else +- errstring = N_("shared object cannot be dlopen()ed"); ++ errstring = N_("shared object cannot be dlopen()ed"); + goto call_lose; + } + +diff --git a/elf/tst-dlopen-pie.c b/elf/tst-dlopen-pie.c +deleted file mode 100644 +index 6a41c731cb..0000000000 +--- a/elf/tst-dlopen-pie.c ++++ /dev/null +@@ -1,49 +0,0 @@ +-/* dlopen test for PIE objects. +- Copyright (C) 2019 Free Software Foundation, Inc. +- This file is part of the GNU C Library. +- +- The GNU C Library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- The GNU C Library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with the GNU C Library; if not, see +- . */ +- +-/* This test attempts to open the (otherwise unrelated) PIE test +- program elf/tst-pie1 and expects the attempt to fail. */ +- +-#include +-#include +-#include +-#include +-#include +- +-static void +-test_mode (int mode) +-{ +- char *pie_path = xasprintf ("%s/elf/tst-pie1", support_objdir_root); +- if (dlopen (pie_path, mode) != NULL) +- FAIL_EXIT1 ("dlopen succeeded unexpectedly (%d)", mode); +- const char *message = dlerror (); +- const char *expected +- = "cannot dynamically load position-independent executable"; +- if (strstr (message, expected) == NULL) +- FAIL_EXIT1 ("unexpected error message (mode %d): %s", mode, message); +-} +- +-static int +-do_test (void) +-{ +- test_mode (RTLD_LAZY); +- test_mode (RTLD_NOW); +- return 0; +-} +- +-#include +diff --git a/include/elf.h b/include/elf.h +index 14ed67ff67..ab76aafb1e 100644 +--- a/include/elf.h ++++ b/include/elf.h +@@ -23,7 +23,7 @@ + # endif + # define DT_1_SUPPORTED_MASK \ + (DF_1_NOW | DF_1_NODELETE | DF_1_INITFIRST | DF_1_NOOPEN \ +- | DF_1_ORIGIN | DF_1_NODEFLIB | DF_1_PIE) ++ | DF_1_ORIGIN | DF_1_NODEFLIB) + + #endif /* !_ISOMAC */ + #endif /* elf.h */ +-- +2.24.1 + diff --git a/glibc.changes b/glibc.changes index bbb5ae6..ab25901 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,6 @@ +* Sun Feb 02 2020 Matti Kosola - 2.30+git2 +- Revert: elf: Refuse to dlopen PIE objects. JB#48615 + * Thu Jan 27 2020 Marko Lemmetty - 2.30+git1 - Update to 2.30 version. Fixes JB#48615 diff --git a/glibc.spec b/glibc.spec index aed5411..d6dcd08 100644 --- a/glibc.spec +++ b/glibc.spec @@ -5,7 +5,7 @@ Name: glibc Summary: GNU C library shared libraries -Version: 2.30+git1 +Version: 2.30+git2 Release: 0 License: LGPLv2+ and LGPLv2+ with exceptions and GPLv2+ URL: http://www.gnu.org/software/libc/ @@ -23,6 +23,7 @@ Patch9: glibc-2.14-locarchive-fedora.patch Patch10: eglibc-2.15-fix-neon-libdl.patch Patch11: eglibc-2.19-shlib-make.patch Patch12: glibc-2.27-bits.patch +Patch13: 0001-Revert-elf-Refuse-to-dlopen-PIE-objects-BZ-24323.patch Provides: ldconfig # The dynamic linker supports DT_GNU_HASH @@ -221,6 +222,7 @@ cd %{glibcsrcdir} %endif %patch11 -p1 %patch12 -p1 +%patch13 -p1 %build GCC=gcc