diff options
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/stabs.c | 16 |
2 files changed, 17 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 2d6241d..c67b49f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2001-03-15 DJ Delorie <dj@redhat.com> + + * stabs.c (s_stab_generic): Don't corrupt the notes obstack by + blindly freeing string if it isn't at the top of the obstack. + 2001-03-13 Alan Modra <alan@linuxcare.com.au> * config/tc-i386.c (RELOC_ENUM): Define. Use throughout file. diff --git a/gas/stabs.c b/gas/stabs.c index e402f70..eed11b3 100644 --- a/gas/stabs.c +++ b/gas/stabs.c @@ -185,7 +185,7 @@ s_stab_generic (what, stab_secname, stabstr_secname) char *stabstr_secname; { long longint; - char *string; + char *string, *saved_string_obstack_end; int type; int other; int desc; @@ -199,12 +199,19 @@ s_stab_generic (what, stab_secname, stabstr_secname) 'd' indicating which type of .stab this is. */ if (what != 's') - string = ""; + { + string = ""; + saved_string_obstack_end = 0; + } else { int length; string = demand_copy_C_string (&length); + /* FIXME: We should probably find some other temporary storage + for string, rather than leaking memory if someone else + happens to use the notes obstack. */ + saved_string_obstack_end = notes.next_free; SKIP_WHITESPACE (); if (*input_line_pointer == ',') input_line_pointer++; @@ -335,8 +342,9 @@ s_stab_generic (what, stab_secname, stabstr_secname) stroff = get_stab_string_offset (string, stabstr_secname); if (what == 's') { - /* release the string */ - obstack_free (¬es, string); + /* Release the string, if nobody else has used the obstack. */ + if (saved_string_obstack_end == notes.next_free) + obstack_free (¬es, string); } /* At least for now, stabs in a special stab section are always |