glibc/elf
Tulio Magno Quites Machado Filho e5d262effe Fix _dl_profile_fixup data-dependency issue (Bug 23690)
There is a data-dependency between the fields of struct l_reloc_result
and the field used as the initialization guard. Users of the guard
expect writes to the structure to be observable when they also observe
the guard initialized. The solution for this problem is to use an acquire
and release load and store to ensure previous writes to the structure are
observable if the guard is initialized.

The previous implementation used DL_FIXUP_VALUE_ADDR (l_reloc_result->addr)
as the initialization guard, making it impossible for some architectures
to load and store it atomically, i.e. hppa and ia64, due to its larger size.

This commit adds an unsigned int to l_reloc_result to be used as the new
initialization guard of the struct, making it possible to load and store
it atomically in all architectures. The fix ensures that the values
observed in l_reloc_result are consistent and do not lead to crashes.
The algorithm is documented in the code in elf/dl-runtime.c
(_dl_profile_fixup). Not all data races have been eliminated.

Tested with build-many-glibcs and on powerpc, powerpc64, and powerpc64le.

	[BZ #23690]
	* elf/dl-runtime.c (_dl_profile_fixup): Guarantee memory
	modification order when accessing reloc_result->addr.
	* include/link.h (reloc_result): Add field init.
	* nptl/Makefile (tests): Add tst-audit-threads.
	(modules-names): Add tst-audit-threads-mod1 and
	tst-audit-threads-mod2.
	Add rules to build tst-audit-threads.
	* nptl/tst-audit-threads-mod1.c: New file.
	* nptl/tst-audit-threads-mod2.c: Likewise.
	* nptl/tst-audit-threads.c: Likewise.
	* nptl/tst-audit-threads.h: Likewise.

Signed-off-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
2018-11-30 18:05:32 -02:00
..
Makefile _dl_exception_create_format: Support %x/%lx/%zx 2018-11-29 14:47:27 -08:00
Versions
cache.c Add more checks for valid ld.so.cache file (bug 18093) 2018-10-24 16:34:02 +02:00
chroot_canon.c
circleload1.c
circlemod1.c
circlemod1a.c
circlemod2.c
circlemod2a.c
circlemod3.c
circlemod3a.c
constload1.c
constload2.c
constload3.c
dblload.c
dblloadmod1.c
dblloadmod2.c
dblloadmod3.c
dblunload.c
dep1.c
dep2.c
dep3.c
dep4.c
dl-addr-obj.c
dl-addr.c elf: Correct absolute (SHN_ABS) symbol run-time calculation [BZ #19818] 2018-04-04 23:09:37 +01:00
dl-brk.c
dl-cache.c Add more checks for valid ld.so.cache file (bug 18093) 2018-10-24 16:34:02 +02:00
dl-close.c
dl-conflict.c
dl-debug.c
dl-deps.c _dl_map_object_deps: Use struct scratch_buffer [BZ #18023] 2018-06-27 17:55:56 +02:00
dl-dst.h Improve DST handling (Bug 23102, Bug 21942, Bug 18018, Bug 23259). 2018-06-12 11:07:56 -04:00
dl-environ.c
dl-error-minimal.c
dl-error-skeleton.c
dl-error.c
dl-exception.c elf/dl-exception.c: Include <_itoa.h> for _itoa prototype 2018-11-29 20:03:46 -08:00
dl-execstack.c
dl-fini.c
dl-fptr.c
dl-hwcaps.c Rename the glibc.tune namespace to glibc.cpu 2018-08-02 23:49:19 +05:30
dl-hwcaps.h Rename the glibc.tune namespace to glibc.cpu 2018-08-02 23:49:19 +05:30
dl-init.c
dl-iteratephdr.c
dl-libc.c
dl-load.c x86: Support IBT and SHSTK in Intel CET [BZ #21598] 2018-07-16 14:08:27 -07:00
dl-load.h
dl-lookup.c elf: Accept absolute (SHN_ABS) symbols whose value is zero [BZ #23307] 2018-06-29 17:10:43 +01:00
dl-machine-reject-phdr.h
dl-map-segments.h
dl-minimal.c
dl-misc.c Avoid cancellable I/O primitives in ld.so. 2018-06-12 09:53:04 -04:00
dl-object.c
dl-open.c x86: Support IBT and SHSTK in Intel CET [BZ #21598] 2018-07-16 14:08:27 -07:00
dl-origin.c
dl-profile.c Avoid cancellable I/O primitives in ld.so. 2018-06-12 09:53:04 -04:00
dl-profstub.c
dl-reloc-static-pie.c static-PIE: Update DT_DEBUG for debugger [BZ #23206] 2018-05-29 06:33:57 -07:00
dl-reloc.c Fix ifunc support with DT_TEXTREL segments (BZ#20480) 2018-09-25 16:27:50 -03:00
dl-runtime.c Fix _dl_profile_fixup data-dependency issue (Bug 23690) 2018-11-30 18:05:32 -02:00
dl-sbrk.c
dl-scope.c
dl-sort-maps.c
dl-support.c hurd: add gscope support 2018-03-11 13:06:33 +01:00
dl-sym.c
dl-symaddr.c elf: Unify symbol address run-time calculation [BZ #19818] 2018-04-04 23:09:37 +01:00
dl-sysdep-open.h
dl-sysdep.c
dl-tls.c
dl-trampoline.c
dl-tunable-types.h
dl-tunables.c
dl-tunables.h
dl-tunables.list Rename the glibc.tune namespace to glibc.cpu 2018-08-02 23:49:19 +05:30
dl-unmap-segments.h
dl-version.c
dl-writev.h
do-rel.h
dynamic-link.h
elf.h C-SKY: Add dynamic relocations to elf.h 2018-11-29 17:32:13 +00:00
enbl-secure.c
failobj.c
filter.c
filtmod1.c
filtmod2.c
firstobj.c
gen-trusted-dirs.awk
genrtldtbl.awk
get-dynamic-info.h Use ADDRIDX with DT_GNU_HASH 2018-02-05 14:58:57 -08:00
global.c
globalmod1.c
ifuncdep1.c
ifuncdep1pic.c
ifuncdep2.c
ifuncdep2pic.c
ifuncdep5.c
ifuncdep5pic.c
ifuncmain1.c
ifuncmain1pic.c
ifuncmain1picstatic.c
ifuncmain1pie.c
ifuncmain1static.c
ifuncmain1staticpic.c
ifuncmain1staticpie.c
ifuncmain1vis.c
ifuncmain1vispic.c
ifuncmain1vispie.c
ifuncmain2.c
ifuncmain2pic.c
ifuncmain2picstatic.c
ifuncmain2static.c
ifuncmain3.c
ifuncmain4.c
ifuncmain4picstatic.c
ifuncmain4static.c
ifuncmain5.c
ifuncmain5pic.c
ifuncmain5picstatic.c
ifuncmain5pie.c
ifuncmain5static.c
ifuncmain5staticpic.c
ifuncmain6pie.c
ifuncmain7.c
ifuncmain7pic.c
ifuncmain7picstatic.c
ifuncmain7pie.c
ifuncmain7static.c
ifuncmod1.c
ifuncmod3.c
ifuncmod5.c
ifuncmod6.c
initfirst.c
interp.c
lateglobal.c
ldconfig.c
ldd.bash.in
link.h
loadfail.c
loadtest.c
ltglobmod1.c
ltglobmod2.c
multiload.c
neededobj1.c
neededobj2.c
neededobj3.c
neededobj4.c
neededobj5.c
neededobj6.c
neededtest.c
neededtest2.c
neededtest3.c
neededtest4.c
next.c
nextmod1.c
nextmod2.c
nodel2mod1.c
nodel2mod2.c
nodel2mod3.c
nodelete.c
nodelete2.c
nodelmod1.c
nodelmod2.c
nodelmod3.c
nodelmod4.c
nodlopen.c
nodlopen2.c
nodlopenmod.c
nodlopenmod2.c
noload.c
order.c
order2.c
order2mod1.c
order2mod2.c
order2mod3.c
order2mod4.c
origtest.c
pathoptobj.c
pldd-xx.c
pldd.c
preloadtest.c
readelflib.c
readlib.c
reldep.c
reldep2.c
reldep3.c
reldep4.c
reldep4mod1.c
reldep4mod2.c
reldep4mod3.c
reldep4mod4.c
reldep5.c
reldep6.c
reldep6mod0.c
reldep6mod1.c
reldep6mod2.c
reldep6mod3.c
reldep6mod4.c
reldep7.c
reldep7mod1.c
reldep7mod2.c
reldep8.c
reldep8mod1.c
reldep8mod2.c
reldep8mod3.c
reldep9.c
reldep9mod1.c
reldep9mod2.c
reldep9mod3.c
reldepmod1.c
reldepmod2.c
reldepmod3.c
reldepmod4.c
reldepmod5.c
reldepmod6.c
resolvfail.c
restest1.c
restest2.c
rtld-Rules
rtld-debugger-interface.txt
rtld.c x86: Support IBT and SHSTK in Intel CET [BZ #21598] 2018-07-16 14:08:27 -07:00
setup-vdso.h
sln.c
sofini.c
soinit.c
sotruss-lib.c
sotruss.sh
sprof.c
static-stubs.c
testobj.h
testobj1.c
testobj1_1.c
testobj2.c
testobj3.c
testobj4.c
testobj5.c
testobj6.c
tls-macros.h
tlsdeschtab.h
tst-_dl_addr_inside_object.c
tst-absolute-sym-lib.c elf: Correct absolute (SHN_ABS) symbol run-time calculation [BZ #19818] 2018-04-04 23:09:37 +01:00
tst-absolute-sym-lib.lds elf: Correct absolute (SHN_ABS) symbol run-time calculation [BZ #19818] 2018-04-04 23:09:37 +01:00
tst-absolute-sym.c elf: Correct absolute (SHN_ABS) symbol run-time calculation [BZ #19818] 2018-04-04 23:09:37 +01:00
tst-absolute-zero-lib.c elf: Accept absolute (SHN_ABS) symbols whose value is zero [BZ #23307] 2018-06-29 17:10:43 +01:00
tst-absolute-zero-lib.lds elf: Accept absolute (SHN_ABS) symbols whose value is zero [BZ #23307] 2018-06-29 17:10:43 +01:00
tst-absolute-zero.c elf: Accept absolute (SHN_ABS) symbols whose value is zero [BZ #23307] 2018-06-29 17:10:43 +01:00
tst-addr1.c
tst-align.c
tst-align2.c
tst-alignmod.c
tst-alignmod2.c
tst-array1-static.c
tst-array1.c
tst-array1.exp
tst-array2.c
tst-array2.exp
tst-array2dep.c
tst-array3.c
tst-array4.c
tst-array4.exp
tst-array5-static.c
tst-array5-static.exp
tst-array5.c
tst-array5.exp
tst-array5dep.c
tst-audit1.c
tst-audit2.c
tst-audit8.c
tst-audit9.c
tst-audit11.c
tst-audit11mod1.c
tst-audit11mod2.c
tst-audit11mod2.map
tst-audit12.c
tst-audit12mod1.c
tst-audit12mod2.c
tst-audit12mod2.map
tst-audit12mod3.c
tst-auditmod1.c
tst-auditmod9a.c
tst-auditmod9b.c
tst-auditmod11.c
tst-auditmod12.c
tst-auxv.c
tst-big-note-lib.S Fix BZ 20419. A PT_NOTE in a binary could be arbitratily large, so using 2018-05-05 18:08:27 -07:00
tst-big-note.c Fix BZ 20419. A PT_NOTE in a binary could be arbitratily large, so using 2018-05-05 18:08:27 -07:00
tst-create_format1.c _dl_exception_create_format: Support %x/%lx/%zx 2018-11-29 14:47:27 -08:00
tst-debug1.c
tst-deep1.c
tst-deep1mod1.c
tst-deep1mod2.c
tst-deep1mod3.c
tst-dl-iter-static.c
tst-dlmodcount.c
tst-dlmopen1.c
tst-dlmopen1mod.c
tst-dlmopen2.c
tst-dlmopen3.c
tst-dlopen-aout.c Fix test failure with -DNDEBUG. 2018-08-30 12:33:22 -04:00
tst-dlopenrpath.c
tst-dlopenrpathmod.c
tst-dlsym-error.c
tst-env-setuid-tunables.c
tst-env-setuid.c
tst-execstack-mod.c
tst-execstack-needed.c
tst-execstack-prog.c
tst-execstack.c
tst-global1.c
tst-gnu2-tls1.c
tst-gnu2-tls1mod.c
tst-ifunc-textrel.c Fix ifunc support with DT_TEXTREL segments (BZ#20480) 2018-09-25 16:27:50 -03:00
tst-initorder.c
tst-initorder.exp
tst-initorder2.c
tst-initorder2.exp
tst-initordera1.c
tst-initordera2.c
tst-initordera3.c
tst-initordera4.c
tst-initorderb1.c
tst-initorderb2.c
tst-latepthread.c
tst-latepthreadmod.c
tst-ldconfig-X.sh
tst-leaks1-static.c
tst-leaks1.c
tst-libc_dlvsym-dso.c
tst-libc_dlvsym-static.c
tst-libc_dlvsym.c
tst-libc_dlvsym.h
tst-linkall-static.c New configure option --disable-crypt. 2018-06-29 16:53:47 +02:00
tst-main1.c
tst-main1mod.c
tst-nodelete-dlclose-dso.c
tst-nodelete-dlclose-plugin.c
tst-nodelete-dlclose.c
tst-nodelete-opened-lib.c
tst-nodelete-opened.c
tst-nodelete-rtldmod.cc
tst-nodelete-uniquemod.cc
tst-nodelete-zmod.cc
tst-nodelete.cc
tst-nodelete2.c
tst-nodelete2mod.c
tst-noload.c
tst-null-argv-lib.c
tst-null-argv.c
tst-order-a1.c
tst-order-a2.c
tst-order-a3.c
tst-order-a4.c
tst-order-b1.c
tst-order-b2.c
tst-order-main.c
tst-pathopt.c
tst-pathopt.sh
tst-pie1.c
tst-pie2.c
tst-piemod1.c
tst-prelink.c
tst-prelink.exp
tst-protected1a.c
tst-protected1b.c
tst-protected1mod.h
tst-protected1moda.c
tst-protected1modb.c
tst-ptrguard1-static.c
tst-ptrguard1.c
tst-relsort1.c
tst-relsort1mod1.c
tst-relsort1mod2.c
tst-rtld-load-self.sh
tst-stackguard1-static.c
tst-stackguard1.c
tst-thrlock.c
tst-tls-dlinfo.c
tst-tls-manydynamic.c
tst-tls-manydynamic.h
tst-tls-manydynamicmod.c
tst-tls1-static-non-pie.c
tst-tls1-static.c
tst-tls1.c
tst-tls2-static.c
tst-tls2.c
tst-tls3.c
tst-tls4.c
tst-tls5.c
tst-tls6.c
tst-tls7.c
tst-tls8.c
tst-tls9-static.c
tst-tls9.c
tst-tls10.c
tst-tls10.h
tst-tls11.c
tst-tls12.c
tst-tls13.c
tst-tls14.c
tst-tls15.c
tst-tls16.c
tst-tls17.c
tst-tls18.c
tst-tls19.c
tst-tls19mod1.c
tst-tls19mod2.c
tst-tls19mod3.c
tst-tlsalign-extern-static.c
tst-tlsalign-extern.c
tst-tlsalign-lib.c
tst-tlsalign-static.c
tst-tlsalign-vars.c
tst-tlsalign.c
tst-tlsmod1.c
tst-tlsmod2.c
tst-tlsmod3.c
tst-tlsmod4.c
tst-tlsmod5.c
tst-tlsmod6.c
tst-tlsmod7.c
tst-tlsmod8.c
tst-tlsmod9.c
tst-tlsmod10.c
tst-tlsmod11.c
tst-tlsmod12.c
tst-tlsmod13.c
tst-tlsmod13a.c
tst-tlsmod14a.c
tst-tlsmod14b.c
tst-tlsmod15a.c
tst-tlsmod15b.c
tst-tlsmod16a.c
tst-tlsmod16b.c
tst-tlsmod17a.c
tst-tlsmod17b.c
tst-tlsmod18a.c
tst-unique1.c
tst-unique1mod1.c
tst-unique1mod2.c
tst-unique2.c
tst-unique2mod1.c
tst-unique2mod2.c
tst-unique3.cc
tst-unique3.h
tst-unique3lib.cc
tst-unique3lib2.cc
tst-unique4.cc
tst-unique4.h
tst-unique4lib.cc
tst-unwind-ctor-lib.c Add missing unwind information to ld.so on powerpc32 (bug 23707) 2018-09-26 16:49:30 +02:00
tst-unwind-ctor.c Add missing unwind information to ld.so on powerpc32 (bug 23707) 2018-09-26 16:49:30 +02:00
tst-unwind-main.c RISC-V: properly terminate call chain (bug 23125) 2018-10-30 12:07:25 +01:00
unload.c
unload2.c
unload2dep.c
unload2mod.c
unload3.c
unload3mod1.c
unload3mod2.c
unload3mod3.c
unload3mod4.c
unload4.c
unload4mod1.c
unload4mod2.c
unload4mod3.c
unload4mod4.c
unload5.c
unload6.c
unload6mod1.c
unload6mod2.c
unload6mod3.c
unload7.c
unload7mod1.c
unload7mod2.c
unload8.c
unload8mod1.c
unload8mod1x.c
unload8mod2.c
unload8mod3.c
unloadmod.c
vismain.c
vismod.h
vismod1.c
vismod2.c
vismod3.c