From: H.J. Lu Date: Wed, 14 Nov 2012 23:44:40 +0000 (-0800) Subject: Skip audit if l_reloc_result is NULL X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3b145207c8c6edfffe1c41c28cb9c46ca4ac5903;p=thirdparty%2Fglibc.git Skip audit if l_reloc_result is NULL Cherry-pick commit 2e64d2659d3edaebc792ac596a9863f1626e5c25 Conflicts: ChangeLog NEWS --- diff --git a/ChangeLog b/ChangeLog index 66817c9c093..368ede106e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2012-11-14 H.J. Lu + + [BZ #14831] + * elf/Makefile (tests): Add tst-audit8. + ($(objpfx)tst-audit8): Also depend on $(common-objpfx)math/libm.so. + ($(objpfx)tst-audit8.out): New target. + (tst-audit8-ENV): New variable. + * elf/dl-runtime.c (_dl_profile_fixup): Call _dl_fixup to skip + audit if l_reloc_result is NULL. + (ELF_MACHINE_RUNTIME_FIXUP_PARAMS): Issue an error if it isn't + defined and ELF_MACHINE_RUNTIME_FIXUP_ARGS is defined. + * elf/tst-audit8.c: New file. + 2012-11-07 Andreas Jaeger [BZ #14809] diff --git a/NEWS b/NEWS index 459553b5bde..7473dc389cb 100644 --- a/NEWS +++ b/NEWS @@ -9,7 +9,7 @@ Version 2.16.1 * The following bugs are resolved with this release: - 6530, 14195, 14459, 14476, 14562, 14621, 14648, 14756, 14809 + 6530, 14195, 14459, 14476, 14562, 14621, 14648, 14756, 14809, 14831 Version 2.16 diff --git a/elf/Makefile b/elf/Makefile index 0c26ce545a7..a621a1c5b22 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -138,7 +138,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \ tst-dlmodcount tst-dlopenrpath tst-deep1 \ tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \ unload3 unload4 unload5 unload6 unload7 unload8 tst-global1 order2 \ - tst-audit1 tst-audit2 \ + tst-audit1 tst-audit2 tst-audit8 \ tst-stackguard1 tst-addr1 tst-thrlock \ tst-unique1 tst-unique2 tst-unique3 tst-unique4 \ tst-initorder tst-initorder2 tst-relsort1 @@ -1024,6 +1024,10 @@ $(objpfx)tst-audit7: $(objpfx)tst-auditmod7a.so $(objpfx)tst-audit7.out: $(objpfx)tst-auditmod7b.so tst-audit7-ENV = LD_AUDIT=$(objpfx)tst-auditmod7b.so +$(objpfx)tst-audit8: $(common-objpfx)math/libm.so +$(objpfx)tst-audit8.out: $(objpfx)tst-auditmod1.so +tst-audit8-ENV = LD_AUDIT=$(objpfx)tst-auditmod1.so + $(objpfx)tst-global1: $(libdl) $(objpfx)tst-global1.out: $(objpfx)testobj6.so $(objpfx)testobj2.so diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index fdaa364c649..009d3660a58 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -1,5 +1,5 @@ /* On-demand PLT fixup for shared objects. - Copyright (C) 1995-2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1995-2012 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 @@ -168,6 +168,26 @@ _dl_profile_fixup ( { void (*mcount_fct) (ElfW(Addr), ElfW(Addr)) = INTUSE(_dl_mcount); + if (l->l_reloc_result == NULL) + { + /* BZ #14843: ELF_DYNAMIC_RELOCATE is called before l_reloc_result + is allocated. We will get here if ELF_DYNAMIC_RELOCATE calls a + resolver function to resolve an IRELATIVE relocation and that + resolver calls a function that is not yet resolved (lazy). For + example, the resolver in x86-64 libm.so calls __get_cpu_features + defined in libc.so. Skip audit and resolve the external function + in this case. */ + *framesizep = -1; + return _dl_fixup ( +# ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS +# ifndef ELF_MACHINE_RUNTIME_FIXUP_PARAMS +# error Please define ELF_MACHINE_RUNTIME_FIXUP_PARAMS. +# endif + ELF_MACHINE_RUNTIME_FIXUP_PARAMS, +# endif + l, reloc_arg); + } + /* This is the address in the array where we store the result of previous relocations. */ struct reloc_result *reloc_result = &l->l_reloc_result[reloc_index]; diff --git a/elf/tst-audit8.c b/elf/tst-audit8.c new file mode 100644 index 00000000000..63656b4ee9d --- /dev/null +++ b/elf/tst-audit8.c @@ -0,0 +1 @@ +#include "../io/pwd.c"