public inbox for binutils-cvs@sourceware.org
 help / color / mirror / Atom feed
* [binutils-gdb] x86: parse_register() must not alter the parsed string
@ 2023-04-19  9:44 Jan Beulich
  0 siblings, 0 replies; only message in thread
From: Jan Beulich @ 2023-04-19  9:44 UTC (permalink / raw)
  To: bfd-cvs

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

commit 4f0813127bc0c525fca152bca4fea30b7490ae14
Author: Jan Beulich <jbeulich@suse.com>
Date:   Wed Apr 19 11:43:26 2023 +0200

    x86: parse_register() must not alter the parsed string
    
    This reverts the code change done by 100f993c53a5 ("x86: Check
    unbalanced braces in memory reference"), which wrongly identified
    e87fb6a6d0cd ("x86/gas: support quoted address scale factor in AT&T
    syntax") as the root cause of PR gas/30248. (The testcase is left in
    place, no matter that it's at best marginally useful in that shape.)
    
    The problem instead is that parse_register() alters the string handed to
    it, thus breaking valid assumptions in subsequent parsing code. Since
    the function's behavior is a result of get_symbol_name()'s, make a copy
    of the incoming string before invoking that function.
    
    Like for parse_real_register() follow the model of strtol() et al: input
    string is const-qualified to signal that the string isn't altered, but
    the returned "end" pointer is not const-qualified, requiring const to be
    cast away (which generally is a bad idea, but the alternative would
    again be more convoluted code).

Diff:
---
 gas/config/tc-i386.c | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 063c9705ddd..7fdd71b490d 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -159,7 +159,7 @@ static int i386_att_operand (char *);
 static int i386_intel_operand (char *, int);
 static int i386_intel_simplify (expressionS *);
 static int i386_intel_parse_name (const char *, expressionS *);
-static const reg_entry *parse_register (char *, char **);
+static const reg_entry *parse_register (const char *, char **);
 static const char *parse_insn (const char *, char *, bool);
 static char *parse_operands (char *, const char *);
 static void swap_operands (void);
@@ -12498,11 +12498,7 @@ i386_att_operand (char *operand_string)
 	  temp_string = base_string;
 
 	  /* Skip past '(' and whitespace.  */
-	  if (*base_string != '(')
-	    {
-	      as_bad (_("unbalanced braces"));
-	      return 0;
-	    }
+	  gas_assert (*base_string == '(');
 	  ++base_string;
 	  if (is_space_char (*base_string))
 	    ++base_string;
@@ -13819,7 +13815,7 @@ parse_real_register (const char *reg_string, char **end_op)
 /* REG_STRING starts *before* REGISTER_PREFIX.  */
 
 static const reg_entry *
-parse_register (char *reg_string, char **end_op)
+parse_register (const char *reg_string, char **end_op)
 {
   const reg_entry *r;
 
@@ -13830,12 +13826,12 @@ parse_register (char *reg_string, char **end_op)
   if (!r)
     {
       char *save = input_line_pointer;
-      char c;
+      char *buf = xstrdup (reg_string), *name;
       symbolS *symbolP;
 
-      input_line_pointer = reg_string;
-      c = get_symbol_name (&reg_string);
-      symbolP = symbol_find (reg_string);
+      input_line_pointer = buf;
+      get_symbol_name (&name);
+      symbolP = symbol_find (name);
       while (symbolP && S_GET_SEGMENT (symbolP) != reg_section)
 	{
 	  const expressionS *e = symbol_get_value_expression(symbolP);
@@ -13853,7 +13849,7 @@ parse_register (char *reg_string, char **end_op)
 	      know (e->X_add_number >= 0
 		    && (valueT) e->X_add_number < i386_regtab_size);
 	      r = i386_regtab + e->X_add_number;
-	      *end_op = input_line_pointer;
+	      *end_op = (char *) reg_string + (input_line_pointer - buf);
 	    }
 	  if (r && !check_register (r))
 	    {
@@ -13862,8 +13858,8 @@ parse_register (char *reg_string, char **end_op)
 	      r = &bad_reg;
 	    }
 	}
-      *input_line_pointer = c;
       input_line_pointer = save;
+      free (buf);
     }
   return r;
 }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-04-19  9:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-19  9:44 [binutils-gdb] x86: parse_register() must not alter the parsed string Jan Beulich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).