diff options
author | DJ Delorie <dj@redhat.com> | 2001-03-15 19:30:32 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2001-03-15 19:30:32 +0000 |
commit | d68d4570182930a4094744cb950d0fbdadbf0746 (patch) | |
tree | 0ee1ef548ae630ce268cdfc69965460e16f69d6d /gas/stabs.c | |
parent | 0015fd9aa4c0bfc4fbc71257e81d302824318729 (diff) | |
download | gdb-d68d4570182930a4094744cb950d0fbdadbf0746.zip gdb-d68d4570182930a4094744cb950d0fbdadbf0746.tar.gz gdb-d68d4570182930a4094744cb950d0fbdadbf0746.tar.bz2 |
* 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.
Diffstat (limited to 'gas/stabs.c')
-rw-r--r-- | gas/stabs.c | 16 |
1 files changed, 12 insertions, 4 deletions
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 |