[2/2] aarch64: Improve --with-arch checks

Message ID 7b38769a-37d4-6cf3-a051-6bc81903bc4d@e124511.cambridge.arm.com
State Accepted
Delegated to: Wilco Dijkstra
Headers
Series aarch64: Issues with --with-arch checks |

Commit Message

Alice Carlotti Jan. 7, 2026, 8:13 p.m. UTC
  - Check for invalid characters before further processing.  Allow only
  alphanumeric characters, "-", "+" and ".".
- Convert "." to "\." before using user input in a sed expression.
- Reject zero-length extension names.
- Quote variables used in echo commands, to avoid unwanted shell
  expansions.

Without these changes, various invalid inputs would be accepted, for
example due to misparsing of "*" and "." characters in regexps and
shell expansions.  Some inputs could also lead to an infinite loop.
  

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index c8265cabd6a226ac9049ba59a09441a5b066a2b0..69f43d8dc64c830561cf87d953198c34c6cf53b6 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -4323,8 +4323,15 @@  case "${target}" in
 		fi
 		for which in cpu arch tune; do
 			eval "val=\$with_$which"
-			base_val=`echo $val | sed -E -e 's/\+.*//'`
-			ext_val=`echo $val | sed -E -e 's/[a-z0-9.-]+//'`
+			filtered_val=`echo "$val" | sed -E -e 's/[-A-Za-z0-9.+]+//'`
+			if [ x"$filtered_val" != x ]; then
+			  echo "Invalid characters used in --with-$which=$val"
+			  exit 1
+			fi
+
+			escaped_val=`echo "$val" | sed -E -e 's/\./\\\./g'`
+			base_val=`echo "$escaped_val" | sed -E -e 's/\+.*//'`
+			ext_val=`echo "$escaped_val" | sed -E -e 's/^[^+]*//'`
 
 			if [ $which = arch ]; then
 			  def=aarch64-arches.def
@@ -4356,20 +4363,19 @@  case "${target}" in
 
 			  while [ x"$ext_val" != x ]
 			  do
-				ext_val=`echo $ext_val | sed -E -e 's/\+//'`
-				ext=`echo $ext_val | sed -E -e 's/\+.*//'`
-				base_ext=`echo $ext | sed -E -e 's/^no//'`
+				ext_val=`echo "$ext_val" | sed -E -e 's/\+//'`
+				ext=`echo "$ext_val" | sed -E -e 's/\+.*//'`
+				base_ext=`echo "$ext" | sed -E -e 's/^no//'`
 				opt_line=`echo -e "$options_parsed" | \
 					grep "^\"$base_ext\""`
 
-				if [ x"$base_ext" = x ] \
-				    || [ x"$opt_line" != x ]; then
+				if [ x"$opt_line" != x ]; then
 				  true
 				else
 				  echo "Unknown extension used in --with-$which=$val" 1>&2
 				  exit 1
 				fi
-				ext_val=`echo $ext_val | sed -E -e 's/[a-z0-9-]+//'`
+				ext_val=`echo "$ext_val" | sed -E -e 's/[^+]+//'`
 			  done
 
 			  true