svn commit: r352340 - head/libexec/rtld-elf

Brandon Bergren bdragon at FreeBSD.org
Sat Sep 14 21:18:11 UTC 2019


Author: bdragon
Date: Sat Sep 14 21:18:10 2019
New Revision: 352340
URL: https://svnweb.freebsd.org/changeset/base/352340

Log:
  Fix aux_info corruption in rtld direct execution mode.
  
  After the aux vector is moved, it is necessary to re-digest aux_info so the
  pointers are updated to the new locations.
  
  This was causing thread creation to fail on powerpc64 when using direct
  execution due to a nonsense value being read for aux_info[AT_STACKPROT].
  
  Approved by: jhibbits (mentor)
  Differential Revision: https://reviews.freebsd.org/D21656

Modified:
  head/libexec/rtld-elf/rtld.c

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Sat Sep 14 20:26:50 2019	(r352339)
+++ head/libexec/rtld-elf/rtld.c	Sat Sep 14 21:18:10 2019	(r352340)
@@ -499,6 +499,13 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entr
 		    if (auxp->a_type == AT_NULL)
 			    break;
 		}
+		/* Since the auxiliary vector has moved, redigest it. */
+		for (i = 0;  i < AT_COUNT;  i++)
+		    aux_info[i] = NULL;
+		for (auxp = aux;  auxp->a_type != AT_NULL;  auxp++) {
+		    if (auxp->a_type < AT_COUNT)
+			aux_info[auxp->a_type] = auxp;
+		}
 	    } else {
 		_rtld_error("No binary");
 		rtld_die();


More information about the svn-src-head mailing list