* stabs.c (s_stab_generic): Don't corrupt the notes obstack by
authorDJ Delorie <dj@redhat.com>
Thu, 15 Mar 2001 19:30:32 +0000 (19:30 +0000)
committerDJ Delorie <dj@redhat.com>
Thu, 15 Mar 2001 19:30:32 +0000 (19:30 +0000)
blindly freeing string if it isn't at the top of the obstack.

gas/ChangeLog
gas/stabs.c

index 2d6241db0af5d980b3fe2d94fbde0869978e213d..c67b49f790b29cd54b61807c6dbccb6b84dfad0f 100644 (file)
@@ -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.
index e402f70648e31a90d15b2182fce62e2fbc415352..eed11b31c697d6b3763305b54060be3ab2714dda 100644 (file)
@@ -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 (&notes, string);
+         /* Release the string, if nobody else has used the obstack.  */
+         if (saved_string_obstack_end == notes.next_free) 
+           obstack_free (&notes, string);
        }
 
       /* At least for now, stabs in a special stab section are always