[binutils-gdb] bpf: fix bpf expression parsing regression in GAS

Jose E. Marchesi jemarch@sourceware.org
Mon Feb 19 19:50:42 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ecd16ae4e47118f66447641d93a6aa1334e550d4

commit ecd16ae4e47118f66447641d93a6aa1334e550d4
Author: Will Hawkins <hawkinsw@obs.cr>
Date:   Mon Feb 19 19:24:19 2024 +0100

    bpf: fix bpf expression parsing regression in GAS
    
    As a result of a switch instead of an if, as would issue non-specific
    error messages when it encountered an operand it could not parse in bpf.
    This patch fixes that regression and adds a test to prevent it from
    reoccurring.
    
    Tested for bpf-unknown-none on x86_64-redhat-linux.
    
    gas/ChangeLog:
    
            * config/tc-bpf.c (parse_expression): Change switch to if so that error
            * condition is handled.
            * testsuite/gas/bpf/bpf.exp: Invoke new test.
            * testsuite/gas/bpf/indcall-badoperand.d: New test.
            * testsuite/gas/bpf/indcall-badoperand.l: New test.
            * testsuite/gas/bpf/indcall-badoperand.s: New test.

Diff:
---
 gas/ChangeLog                 | 9 +++++++++
 gas/config/tc-bpf.c           | 2 +-
 gas/testsuite/gas/bpf/bpf.exp | 3 +++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 3ae1d777359..88e61083c44 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,12 @@
+2024-02-19 Will Hawkins  <hawkinsw@obs.cr>
+
+	* config/tc-bpf.c (parse_expression): Change switch to if so that
+	error condition is handled.
+	* testsuite/gas/bpf/indcall-badoperand.d: New test.
+	* testsuite/gas/bpf/indcall-badoperand.l: Likewise.
+	* testsuite/gas/bpf/indcall-badoperand.s: Likewise.
+	* testsuite/gas/bpf/bpf.exp: Invoke new test.
+
 2024-02-19  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
 	* config/tc-bpf.c (md_assemble): Fix to take into account that
diff --git a/gas/config/tc-bpf.c b/gas/config/tc-bpf.c
index e23de4e0d19..dfa44ea194c 100644
--- a/gas/config/tc-bpf.c
+++ b/gas/config/tc-bpf.c
@@ -1240,7 +1240,7 @@ parse_expression (char *s, expressionS *exp)
   s = input_line_pointer;
   input_line_pointer = saved_input_line_pointer;
 
-  switch (exp->X_op == O_absent || exp_parse_failed)
+  if (exp->X_op == O_absent || exp_parse_failed)
     return NULL;
 
   /* The expression parser may consume trailing whitespaces.  We have
diff --git a/gas/testsuite/gas/bpf/bpf.exp b/gas/testsuite/gas/bpf/bpf.exp
index dae8bd924d0..5faae5b859e 100644
--- a/gas/testsuite/gas/bpf/bpf.exp
+++ b/gas/testsuite/gas/bpf/bpf.exp
@@ -77,6 +77,9 @@ if {[istarget bpf*-*-*]} {
     run_dump_test disp32-overflow
     run_dump_test imm32-overflow
 
+    # Bad operand (regression)
+    run_dump_test indcall-badoperand
+
     # In Pseudo-C it is not possible to refer to symbols
     # as operands that have the same name than registers.
     run_dump_test regs-for-symbols-pseudoc


More information about the Binutils-cvs mailing list