Browse Source

* avoid stack overflow in tref.done (bug 846)

pierre 25 years ago
parent
commit
12d4917565
3 changed files with 37 additions and 10 deletions
  1. 9 3
      compiler/symdef.inc
  2. 9 3
      compiler/symsym.inc
  3. 19 4
      compiler/symtable.pas

+ 9 - 3
compiler/symdef.inc

@@ -2736,7 +2736,10 @@ Const local_symtable_index : longint = $8001;
     destructor tprocdef.done;
     destructor tprocdef.done;
       begin
       begin
          if assigned(defref) then
          if assigned(defref) then
-           dispose(defref,done);
+           begin
+             defref^.freechain;
+             dispose(defref,done);
+           end;
          if assigned(parast) then
          if assigned(parast) then
            dispose(parast,done);
            dispose(parast,done);
          if assigned(localst) and (localst^.symtabletype<>staticsymtable) then
          if assigned(localst) and (localst^.symtabletype<>staticsymtable) then
@@ -3921,7 +3924,10 @@ Const local_symtable_index : longint = $8001;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.194  2000-02-09 13:23:04  peter
+  Revision 1.195  2000-02-11 13:53:49  pierre
+   * avoid stack overflow in tref.done (bug 846)
+
+  Revision 1.194  2000/02/09 13:23:04  peter
     * log truncated
     * log truncated
 
 
   Revision 1.193  2000/02/05 14:33:32  florian
   Revision 1.193  2000/02/05 14:33:32  florian
@@ -3993,4 +3999,4 @@ Const local_symtable_index : longint = $8001;
   Revision 1.174  1999/11/06 14:34:26  peter
   Revision 1.174  1999/11/06 14:34:26  peter
     * truncated log to 20 revs
     * truncated log to 20 revs
 
 
-}
+}

+ 9 - 3
compiler/symsym.inc

@@ -147,7 +147,10 @@
     destructor tsym.done;
     destructor tsym.done;
       begin
       begin
          if assigned(defref) then
          if assigned(defref) then
-           dispose(defref,done);
+           begin
+             defref^.freechain;
+             dispose(defref,done);
+           end;
         inherited done;
         inherited done;
       end;
       end;
 
 
@@ -2122,7 +2125,10 @@
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.138  2000-02-09 13:23:05  peter
+  Revision 1.139  2000-02-11 13:53:49  pierre
+   * avoid stack overflow in tref.done (bug 846)
+
+  Revision 1.138  2000/02/09 13:23:05  peter
     * log truncated
     * log truncated
 
 
   Revision 1.137  2000/02/04 08:47:10  florian
   Revision 1.137  2000/02/04 08:47:10  florian
@@ -2205,4 +2211,4 @@
     * -CX is create smartlink
     * -CX is create smartlink
     * -CD is create dynamic, but does nothing atm.
     * -CD is create dynamic, but does nothing atm.
 
 
-}
+}

+ 19 - 4
compiler/symtable.pas

@@ -79,6 +79,7 @@ unit symtable;
          moduleindex : word;
          moduleindex : word;
          is_written  : boolean;
          is_written  : boolean;
          constructor init(ref:pref;pos:pfileposinfo);
          constructor init(ref:pref;pos:pfileposinfo);
+         procedure   freechain;
          destructor  done; virtual;
          destructor  done; virtual;
        end;
        end;
 
 
@@ -803,6 +804,19 @@ implementation
         is_written:=false;
         is_written:=false;
       end;
       end;
 
 
+    procedure tref.freechain;
+      var
+        p,q : pref;
+      begin
+        p:=nextref;
+        nextref:=nil;
+        while assigned(p) do
+          begin
+            q:=p^.nextref;
+            dispose(p,done);
+            p:=q;
+          end;
+      end;
 
 
     destructor tref.done;
     destructor tref.done;
       var
       var
@@ -811,8 +825,6 @@ implementation
          inputfile:=get_source_file(moduleindex,posinfo.fileindex);
          inputfile:=get_source_file(moduleindex,posinfo.fileindex);
          if inputfile<>nil then
          if inputfile<>nil then
            dec(inputfile^.ref_count);
            dec(inputfile^.ref_count);
-         if assigned(nextref) then
-          dispose(nextref,done);
          nextref:=nil;
          nextref:=nil;
       end;
       end;
 
 
@@ -2769,7 +2781,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.76  2000-02-09 13:23:05  peter
+  Revision 1.77  2000-02-11 13:53:49  pierre
+   * avoid stack overflow in tref.done (bug 846)
+
+  Revision 1.76  2000/02/09 13:23:05  peter
     * log truncated
     * log truncated
 
 
   Revision 1.75  2000/01/12 10:38:18  peter
   Revision 1.75  2000/01/12 10:38:18  peter
@@ -2845,4 +2860,4 @@ end.
   Revision 1.56  1999/11/04 23:13:25  peter
   Revision 1.56  1999/11/04 23:13:25  peter
     * moved unit alias support into ifdef
     * moved unit alias support into ifdef
 
 
-}
+}