[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gas SEGV reporting an error + patch
From: |
Mat Hostetter |
Subject: |
gas SEGV reporting an error + patch |
Date: |
11 Jul 2006 15:30:16 -0400 |
gas 2.14 and 2.16 can SEGV trying to report an error
assembling this erroneous code:
.set bar,5f+text1
5:
text1:
The bug is that 'report_op_error' incorrectly uses 'file' and 'line'
in the 'else' case where they are not initialized. Because the value
of 'file' is garbage, it is of course somewhat random whether you will
see a crash.
The fix is trivial: since there is no location information available,
use 'as_bad' instead of 'as_bad_where', as it was already doing for
other errors in the 'else' case.
--- tools/gnu/gas/symbols.c~ 2006-01-11 11:16:48.000000000 -0500
+++ tools/gnu/gas/symbols.c 2006-07-11 15:16:59.000000000 -0400
@@ -863,25 +863,23 @@
as_bad (_("undefined symbol `%s' in operation setting `%s'"),
S_GET_NAME (left), S_GET_NAME (symp));
if (seg_right == undefined_section)
as_bad (_("undefined symbol `%s' in operation setting `%s'"),
S_GET_NAME (right), S_GET_NAME (symp));
if (seg_left != undefined_section
&& seg_right != undefined_section)
{
if (right)
- as_bad_where (file, line,
- _("invalid sections for operation on `%s' and `%s'
setting `%s'"),
- S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME
(symp));
+ as_bad (_("invalid sections for operation on `%s' and `%s' setting
`%s'"),
+ S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
else
- as_bad_where (file, line,
- _("invalid section for operation on `%s' setting
`%s'"),
- S_GET_NAME (left), S_GET_NAME (symp));
+ as_bad (_("invalid section for operation on `%s' setting `%s'"),
+ S_GET_NAME (left), S_GET_NAME (symp));
}
}
}
/* Resolve the value of a symbol. This is called during the final
pass over the symbol table to resolve any symbols with complex
values. */
valueT
- gas SEGV reporting an error + patch,
Mat Hostetter <=