Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'jb48780' into 'master'
Revert: elf: Refuse to dlopen PIE objects.

See merge request mer-core/glibc!36
  • Loading branch information
Matti Kosola committed Feb 2, 2020
2 parents 19e4172 + df05690 commit 4989a22
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 1 deletion.
150 changes: 150 additions & 0 deletions 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 <matti.kosola@jolla.com>
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
- <http://www.gnu.org/licenses/>. */
-
-/* This test attempts to open the (otherwise unrelated) PIE test
- program elf/tst-pie1 and expects the attempt to fail. */
-
-#include <dlfcn.h>
-#include <stddef.h>
-#include <string.h>
-#include <support/check.h>
-#include <support/support.h>
-
-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 <support/test-driver.c>
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

3 changes: 3 additions & 0 deletions glibc.changes
@@ -1,3 +1,6 @@
* Sun Feb 02 2020 Matti Kosola <matti.kosola@jolla.com> - 2.30+git2
- Revert: elf: Refuse to dlopen PIE objects. JB#48615

* Thu Jan 27 2020 Marko Lemmetty <marko.lemmetty@jolla.com> - 2.30+git1
- Update to 2.30 version. Fixes JB#48615

Expand Down
4 changes: 3 additions & 1 deletion glibc.spec
Expand Up @@ -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/
Expand All @@ -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
Expand Down Expand Up @@ -221,6 +222,7 @@ cd %{glibcsrcdir}
%endif
%patch11 -p1
%patch12 -p1
%patch13 -p1

%build
GCC=gcc
Expand Down

0 comments on commit 4989a22

Please sign in to comment.