Andreas Schwab
5005d4836d
- tls-dtor-list-mangling.patch: Harden tls_dtor_list with pointer mangling (BZ #19018) - prelink-elf-rtype-class.patch: Keep only ELF_RTYPE_CLASS_{PLT|COPY} bits for prelink (BZ #19178) - vector-finite-math-aliases.patch: Better workaround for aliases of *_finite symbols in vector math library (BZ# 19058) - powerpc-elision-adapt-param.patch: powerpc: Fix usage of elision transient failure adapt param (BZ #19174) - catopen-unbound-alloca.patch: Fix unbound alloca in catopen (CVE-2015-8779, bsc#962739, BZ #17905) - strftime-range-check.patch: Add range check on time fields (CVE-2015-8776, bsc#962736, BZ #18985) - hcreate-overflow-check.patch: Handle overflow in hcreate (CVE-2015-8778, bsc#962737, BZ #18240) - errorcheck-mutex-no-elision.patch: Don't do lock elision on an error checking mutex (bsc#956716, BZ #17514) - refactor-nan-parsing.patch: Refactor strtod parsing of NaN payloads (CVE-2014-9761, bsc#962738, BZ #16962) - send-dg-buffer-overflow.patch: Fix getaddrinfo stack-based buffer overflow (CVE-2015-7547, bsc#961721, BZ #18665) - powerpc-lock-elision-race.patch: renamed from 0001-powerpc-Fix-a-race-condition-when-eliding-a-lock-20150730.patch OBS-URL: https://build.opensuse.org/request/show/359989 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=421
259 lines
8.4 KiB
Diff
259 lines
8.4 KiB
Diff
2015-11-14 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
* config.make.in (have-glob-dat-reloc): New.
|
|
* configure.ac (libc_cv_has_glob_dat): New. Set to yes if
|
|
target supports GLOB_DAT relocaton. AC_SUBST.
|
|
* configure: Regenerated.
|
|
* elf/Makefile (tests): Add tst-prelink.
|
|
(tests-special): Add $(objpfx)tst-prelink-cmp.out.
|
|
(tst-prelink-ENV): New.
|
|
($(objpfx)tst-prelink-conflict.out): Likewise.
|
|
($(objpfx)tst-prelink-cmp.out): Likewise.
|
|
* sysdeps/x86/tst-prelink.c: Moved to ...
|
|
* elf/tst-prelink.c: Here.
|
|
* sysdeps/x86/tst-prelink.exp: Moved to ...
|
|
* elf/tst-prelink.exp: Here.
|
|
* sysdeps/x86/Makefile (tests): Don't add tst-prelink.
|
|
(tst-prelink-ENV): Removed.
|
|
($(objpfx)tst-prelink-conflict.out): Likewise.
|
|
($(objpfx)tst-prelink-cmp.out): Likewise.
|
|
(tests-special): Don't add $(objpfx)tst-prelink-cmp.out.
|
|
|
|
2015-11-10 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
[BZ #19178]
|
|
* sysdeps/x86/Makefile (tests): Add tst-prelink.
|
|
(tst-prelink-ENV): New.
|
|
($(objpfx)tst-prelink-conflict.out): Likewise.
|
|
($(objpfx)tst-prelink-cmp.out): Likewise.
|
|
(tests-special): Add $(objpfx)tst-prelink-cmp.out.
|
|
* sysdeps/x86/tst-prelink.c: New file.
|
|
* sysdeps/x86/tst-prelink.exp: Likewise.
|
|
|
|
2015-11-07 H.J. Lu <hongjiu.lu@intel.com>
|
|
|
|
[BZ #19178]
|
|
* elf/dl-lookup.c (RTYPE_CLASS_VALID): New.
|
|
(RTYPE_CLASS_PLT): Likewise.
|
|
(RTYPE_CLASS_COPY): Likewise.
|
|
(RTYPE_CLASS_TLS): Likewise.
|
|
(_dl_debug_bindings): Use RTYPE_CLASS_TLS and RTYPE_CLASS_VALID
|
|
to set relocation type class for DL_DEBUG_PRELINK. Keep only
|
|
ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY bits for
|
|
DL_DEBUG_PRELINK.
|
|
|
|
Index: glibc-2.22/config.make.in
|
|
===================================================================
|
|
--- glibc-2.22.orig/config.make.in
|
|
+++ glibc-2.22/config.make.in
|
|
@@ -51,6 +51,7 @@ have-z-combreloc = @libc_cv_z_combreloc@
|
|
have-z-execstack = @libc_cv_z_execstack@
|
|
have-Bgroup = @libc_cv_Bgroup@
|
|
have-protected-data = @libc_cv_protected_data@
|
|
+have-glob-dat-reloc = @libc_cv_has_glob_dat@
|
|
with-fp = @with_fp@
|
|
old-glibc-headers = @old_glibc_headers@
|
|
unwind-find-fde = @libc_cv_gcc_unwind_find_fde@
|
|
Index: glibc-2.22/configure
|
|
===================================================================
|
|
--- glibc-2.22.orig/configure
|
|
+++ glibc-2.22/configure
|
|
@@ -628,6 +628,7 @@ gnu89_inline
|
|
libc_cv_ssp
|
|
fno_unit_at_a_time
|
|
libc_cv_output_format
|
|
+libc_cv_has_glob_dat
|
|
libc_cv_hashstyle
|
|
libc_cv_fpie
|
|
libc_cv_z_execstack
|
|
@@ -6335,6 +6336,39 @@ $as_echo "$libc_cv_use_default_link" >&6
|
|
use_default_link=$libc_cv_use_default_link
|
|
fi
|
|
|
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLOB_DAT reloc" >&5
|
|
+$as_echo_n "checking for GLOB_DAT reloc... " >&6; }
|
|
+if ${libc_cv_has_glob_dat+:} false; then :
|
|
+ $as_echo_n "(cached) " >&6
|
|
+else
|
|
+ cat > conftest.c <<EOF
|
|
+extern int mumble;
|
|
+int foo (void) { return mumble; }
|
|
+EOF
|
|
+if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
|
+ -fPIC -shared -o conftest.so conftest.c
|
|
+ -nostdlib -nostartfiles
|
|
+ 1>&5'
|
|
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
|
|
+ (eval $ac_try) 2>&5
|
|
+ ac_status=$?
|
|
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
|
+ test $ac_status = 0; }; }
|
|
+then
|
|
+ if $READELF -rW conftest.so | grep '_GLOB_DAT' > /dev/null; then
|
|
+ libc_cv_has_glob_dat=yes
|
|
+ else
|
|
+ libc_cv_has_glob_dat=no
|
|
+ fi
|
|
+else
|
|
+ libc_cv_has_glob_dat=no
|
|
+fi
|
|
+rm -f conftest*
|
|
+fi
|
|
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_has_glob_dat" >&5
|
|
+$as_echo "$libc_cv_has_glob_dat" >&6; }
|
|
+
|
|
+
|
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker output format" >&5
|
|
$as_echo_n "checking linker output format... " >&6; }
|
|
if ${libc_cv_output_format+:} false; then :
|
|
Index: glibc-2.22/configure.ac
|
|
===================================================================
|
|
--- glibc-2.22.orig/configure.ac
|
|
+++ glibc-2.22/configure.ac
|
|
@@ -1535,6 +1535,29 @@ $ac_try"
|
|
use_default_link=$libc_cv_use_default_link
|
|
fi
|
|
|
|
+AC_CACHE_CHECK(for GLOB_DAT reloc,
|
|
+ libc_cv_has_glob_dat, [dnl
|
|
+cat > conftest.c <<EOF
|
|
+extern int mumble;
|
|
+int foo (void) { return mumble; }
|
|
+EOF
|
|
+if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS
|
|
+ -fPIC -shared -o conftest.so conftest.c
|
|
+ -nostdlib -nostartfiles
|
|
+ 1>&AS_MESSAGE_LOG_FD])
|
|
+then
|
|
+dnl look for GLOB_DAT relocation.
|
|
+ if $READELF -rW conftest.so | grep '_GLOB_DAT' > /dev/null; then
|
|
+ libc_cv_has_glob_dat=yes
|
|
+ else
|
|
+ libc_cv_has_glob_dat=no
|
|
+ fi
|
|
+else
|
|
+ libc_cv_has_glob_dat=no
|
|
+fi
|
|
+rm -f conftest*])
|
|
+AC_SUBST(libc_cv_has_glob_dat)
|
|
+
|
|
AC_CACHE_CHECK(linker output format, libc_cv_output_format, [dnl
|
|
if libc_cv_output_format=`
|
|
${CC-cc} -nostartfiles -nostdlib -Wl,--print-output-format 2>&AS_MESSAGE_LOG_FD`
|
|
Index: glibc-2.22/elf/Makefile
|
|
===================================================================
|
|
--- glibc-2.22.orig/elf/Makefile
|
|
+++ glibc-2.22/elf/Makefile
|
|
@@ -292,6 +292,13 @@ check-abi: $(objpfx)check-abi-ld.out
|
|
tests-special += $(objpfx)check-abi-ld.out
|
|
update-abi: update-abi-ld
|
|
|
|
+ifeq ($(have-glob-dat-reloc),yes)
|
|
+tests += tst-prelink
|
|
+ifeq ($(run-built-tests),yes)
|
|
+tests-special += $(objpfx)tst-prelink-cmp.out
|
|
+endif
|
|
+endif
|
|
+
|
|
include ../Rules
|
|
|
|
ifeq (yes,$(build-shared))
|
|
@@ -1205,3 +1212,13 @@ $(objpfx)tst-unused-dep.out: $(objpfx)te
|
|
$(objpfx)tst-unused-dep-cmp.out: $(objpfx)tst-unused-dep.out
|
|
cmp $< /dev/null > $@; \
|
|
$(evaluate-test)
|
|
+
|
|
+tst-prelink-ENV = LD_TRACE_PRELINKING=1
|
|
+
|
|
+$(objpfx)tst-prelink-conflict.out: $(objpfx)tst-prelink.out
|
|
+ grep stdout $< | grep conflict | $(AWK) '{ print $$10, $$11 }' > $@
|
|
+
|
|
+$(objpfx)tst-prelink-cmp.out: tst-prelink.exp \
|
|
+ $(objpfx)tst-prelink-conflict.out
|
|
+ cmp $^ > $@; \
|
|
+ $(evaluate-test)
|
|
Index: glibc-2.22/elf/dl-lookup.c
|
|
===================================================================
|
|
--- glibc-2.22.orig/elf/dl-lookup.c
|
|
+++ glibc-2.22/elf/dl-lookup.c
|
|
@@ -1016,6 +1016,18 @@ _dl_debug_bindings (const char *undef_na
|
|
#ifdef SHARED
|
|
if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
|
|
{
|
|
+/* ELF_RTYPE_CLASS_XXX must match RTYPE_CLASS_XXX used by prelink with
|
|
+ LD_TRACE_PRELINKING. */
|
|
+#define RTYPE_CLASS_VALID 8
|
|
+#define RTYPE_CLASS_PLT (8|1)
|
|
+#define RTYPE_CLASS_COPY (8|2)
|
|
+#define RTYPE_CLASS_TLS (8|4)
|
|
+#if ELF_RTYPE_CLASS_PLT != 0 && ELF_RTYPE_CLASS_PLT != 1
|
|
+# error ELF_RTYPE_CLASS_PLT must be 0 or 1!
|
|
+#endif
|
|
+#if ELF_RTYPE_CLASS_COPY != 0 && ELF_RTYPE_CLASS_COPY != 2
|
|
+# error ELF_RTYPE_CLASS_COPY must be 0 or 2!
|
|
+#endif
|
|
int conflict = 0;
|
|
struct sym_val val = { NULL, NULL };
|
|
|
|
@@ -1071,12 +1083,17 @@ _dl_debug_bindings (const char *undef_na
|
|
|
|
if (value->s)
|
|
{
|
|
+ /* Keep only ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY
|
|
+ bits since since prelink only uses them. */
|
|
+ type_class &= ELF_RTYPE_CLASS_PLT | ELF_RTYPE_CLASS_COPY;
|
|
if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
|
|
== STT_TLS))
|
|
- type_class = 4;
|
|
+ /* Clear the RTYPE_CLASS_VALID bit in RTYPE_CLASS_TLS. */
|
|
+ type_class = RTYPE_CLASS_TLS & ~RTYPE_CLASS_VALID;
|
|
else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
|
|
== STT_GNU_IFUNC))
|
|
- type_class |= 8;
|
|
+ /* Set the RTYPE_CLASS_VALID bit. */
|
|
+ type_class |= RTYPE_CLASS_VALID;
|
|
}
|
|
|
|
if (conflict
|
|
Index: glibc-2.22/elf/tst-prelink.c
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ glibc-2.22/elf/tst-prelink.c
|
|
@@ -0,0 +1,30 @@
|
|
+/* Test the output from the environment variable, LD_TRACE_PRELINKING,
|
|
+ for prelink.
|
|
+ Copyright (C) 2015 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/>. */
|
|
+
|
|
+#include <stdio.h>
|
|
+
|
|
+static int
|
|
+do_test (void)
|
|
+{
|
|
+ fprintf (stdout, "hello\n");
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+#define TEST_FUNCTION do_test ()
|
|
+#include "../test-skeleton.c"
|
|
Index: glibc-2.22/elf/tst-prelink.exp
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ glibc-2.22/elf/tst-prelink.exp
|
|
@@ -0,0 +1 @@
|
|
+/0 stdout
|