From e78bb25cb636a331f27e9cc4cba5522939567695 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Wed, 3 May 2017 09:52:01 +0100 Subject: [PATCH] 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. --- gas/ChangeLog | 6 ++++++ gas/symbols.c | 20 +++++++++++++++++--- 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 + + PR gas/20941 + * symbols.c (snapshot_symbol): Handle the case where + resolve_expression returns a local symbol. + 2017-05-02 Maciej W. Rozycki * 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) -- 2.30.2