aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2017-05-03 09:52:01 +0100
committerNick Clifton <nickc@redhat.com>2017-05-03 09:52:01 +0100
commite78bb25cb636a331f27e9cc4cba5522939567695 (patch)
tree71730c6b9aba064d7a2bd1eeea5110afde5ee351 /gas
parentAutomatic date update in version.in (diff)
downloadbinutils-gdb-e78bb25cb636a331f27e9cc4cba5522939567695.tar.gz
binutils-gdb-e78bb25cb636a331f27e9cc4cba5522939567695.tar.bz2
binutils-gdb-e78bb25cb636a331f27e9cc4cba5522939567695.zip
Prevent a seg-fault in the assembler when provided with a bogus input source file.
PR gas/20941 * symbols.c (snapshot_symbol): Handle the case where resolve_expression returns a local symbol.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/symbols.c20
2 files changed, 23 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 24155f15441..ad3444bf0e4 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/symbols.c b/gas/symbols.c
index 7146c7d5734..19a1fa57283 100644
--- a/gas/symbols.c
+++ b/gas/symbols.c
@@ -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)