qemu-trivial
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] configure: Fix excessive error detection when handling --cro


From: Greg Kurz
Subject: [PATCH 2/2] configure: Fix excessive error detection when handling --cross-cc-FOO
Date: Fri, 23 Jul 2021 16:46:01 +0200

Passing a --cross-cc-cflags-* option with a value that contains a '='
causes configure to exit:

$ ./configure --cross-cc-cflags-arm='-DFOO=bar'

ERROR: Passed bad --cross-cc-FOO option

This is an annoying limitation since '=' is frequently found
in CFLAGS.

This is caused by this line in the CC options parsing loop:

  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"

The '[!a-zA-Z0-9_-]' pattern matches the first '=' in the
option and the '=' pattern matches the other one. The '*'
patterns then match the rest.

The intent seems to be that we only want characters from the
range [a-zA-Z0-9_-] in the option name. Shell pattern matching
isn't powerful enough to do that with a single expression.

First, isolate the option name, i.e. before the first '=' character,
with a regular expression. Only error out if there's at least one
unwanted character in the name.

Fixes: d75402b5ee29 ("configure: add support for --cross-cc-FOO")
Cc: alex.bennee@linaro.org
Signed-off-by: Greg Kurz <groug@kaod.org>
---
 configure | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/configure b/configure
index 3a926ff8fc23..61a415e4dc61 100755
--- a/configure
+++ b/configure
@@ -472,16 +472,23 @@ for opt do
   ;;
   --disable-debug-info) debug_info="no"
   ;;
-  --cross-cc-*[!a-zA-Z0-9_-]*=*) error_exit "Passed bad --cross-cc-FOO option"
-  ;;
-  --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-cflags-}; 
cc_arch=${cc_arch%%=*}
-                      eval "cross_cc_cflags_${cc_arch}=\$optarg"
-                      cross_cc_vars="$cross_cc_vars cross_cc_cflags_${cc_arch}"
-  ;;
-  --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
-                cc_archs="$cc_archs $cc_arch"
-                eval "cross_cc_${cc_arch}=\$optarg"
-                cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
+  --cross-cc-*=*)
+    optname=$(expr "x$opt" : 'x\([^=]*\)=.*')
+    case "$optname" in
+    *[!a-zA-Z0-9_-]*) error_exit "Passed bad $optname option"
+    ;;
+    esac
+    case "$opt" in
+    --cross-cc-cflags-*) cc_arch=${opt#--cross-cc-cflags-}; 
cc_arch=${cc_arch%%=*}
+                         eval "cross_cc_cflags_${cc_arch}=\$optarg"
+                         cross_cc_vars="$cross_cc_vars 
cross_cc_cflags_${cc_arch}"
+    ;;
+    --cross-cc-*) cc_arch=${opt#--cross-cc-}; cc_arch=${cc_arch%%=*}
+                  cc_archs="$cc_archs $cc_arch"
+                  eval "cross_cc_${cc_arch}=\$optarg"
+                  cross_cc_vars="$cross_cc_vars cross_cc_${cc_arch}"
+    ;;
+    esac
   ;;
   esac
 done
-- 
2.31.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]