Prevent a seg-fault in the assembler when provided with a bogus input source file.
authorNick Clifton <nickc@redhat.com>
Wed, 3 May 2017 08:52:01 +0000 (09:52 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 3 May 2017 08:52:01 +0000 (09:52 +0100)
PR gas/20941
* symbols.c (snapshot_symbol): Handle the case where
resolve_expression returns a local symbol.

gas/ChangeLog
gas/symbols.c

index 24155f15441360ffc8aad47bced8ae6875d97bec..ad3444bf0e44e518ac00f2628986751bc8c979c7 100644 (file)
@@ -1,3 +1,9 @@
+2017-05-03  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/20941
+       * symbols.c (snapshot_symbol): Handle the case where
+       resolve_expression returns a local symbol.
+
 2017-05-02  Maciej W. Rozycki  <macro@imgtec.com>
 
        * config/tc-mips.c (append_insn): Call `symbol_append' for any
index 7146c7d573472810739c243dbbb9ec8effbc058b..19a1fa57283f1f97e759db85655121d0d58e4f6f 100644 (file)
@@ -1561,9 +1561,23 @@ snapshot_symbol (symbolS **symbolPP, valueT *valueP, segT *segP, fragS **fragPP)
        }
 
       *symbolPP = symbolP;
-      *valueP = exp.X_add_number;
-      *segP = symbolP->bsym->section;
-      *fragPP = symbolP->sy_frag;
+
+      /* A bogus input file can result in resolve_expression()
+        generating a local symbol, so we have to check again.  */
+      if (LOCAL_SYMBOL_CHECK (symbolP))
+       {
+         struct local_symbol *locsym = (struct local_symbol *) symbolP;
+
+         *valueP = locsym->lsy_value;
+         *segP = locsym->lsy_section;
+         *fragPP = local_symbol_get_frag (locsym);
+       }
+      else
+       {
+         *valueP = exp.X_add_number;
+         *segP = symbolP->bsym->section;
+         *fragPP = symbolP->sy_frag;
+       }
 
       if (*segP == expr_section)
        switch (exp.X_op)