svn commit: r361538 - in stable: 11/stand/common 12/stand/common

Kyle Evans kevans at FreeBSD.org
Tue May 26 19:34:06 UTC 2020


Author: kevans
Date: Tue May 26 19:34:05 2020
New Revision: 361538
URL: https://svnweb.freebsd.org/changeset/base/361538

Log:
  loader: fix userboot's ability to detect a guest's interpreter
  
  Some time after r338418, I believe with -Os/-Oz -ffunction-sections
  -fdata-sections, the bootprog_interp variable that held our "$Interpreter:"
  marker started getting strip from all loaders, with exception to userboot
  since it used bootprog_interp to determine what flavor of userboot it was.
  
  At some point, it had been brought to my attention that this was no longer
  working and I had worked up some potential solutions to use the variable
  that involved printing it out. My vague recollection is that this was
  rejected, and I forgot to explore the alternatives; I cannot find records of
  this discussion anymore.
  
  Fast forward to present day, Andrew reported that it was non-functional and
  offered (effectively) this patch (sans comment) to stop the compiler from
  optimizing it out by assigning it to a volatile variable. This removes
  concerns about user-facing change while retaining the interpreter marker.
  Furthermore, it could certainly be uglier.

Modified:
  stable/12/stand/common/interp.c
Directory Properties:
  stable/12/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/11/stand/common/interp.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/12/stand/common/interp.c
==============================================================================
--- stable/12/stand/common/interp.c	Tue May 26 19:22:46 2020	(r361537)
+++ stable/12/stand/common/interp.c	Tue May 26 19:34:05 2020	(r361538)
@@ -45,8 +45,17 @@ __FBSDID("$FreeBSD$");
 void
 interact(void)
 {
-	static char	input[256];			/* big enough? */
+	static char		input[256];		/* big enough? */
+	const char * volatile	interp_identifier;
 
+	/*
+	 * Because interp_identifier is volatile, it cannot be optimized out by
+	 * the compiler as it's considered an externally observable event.  This
+	 * prevents the compiler from optimizing out our carefully placed
+	 * $Interpreter:4th string that userboot may use to determine that
+	 * we need to switch interpreters.
+	 */
+	interp_identifier = bootprog_interp;
 	interp_init();
 
 	printf("\n");


More information about the svn-src-stable mailing list