浏览代码

* fix for Mantis #35862: free the list of functions added with AddTerminateProc to avoid memory leaks
+ added test

git-svn-id: trunk@42457 -

svenbarth 6 年之前
父节点
当前提交
176a63b67b

+ 1 - 0
.gitattributes

@@ -16698,6 +16698,7 @@ tests/webtbs/tw3577.pp svneol=native#text/plain
 tests/webtbs/tw3578.pp svneol=native#text/plain
 tests/webtbs/tw3579.pp svneol=native#text/plain
 tests/webtbs/tw3583.pp svneol=native#text/plain
+tests/webtbs/tw35862.pp svneol=native#text/pascal
 tests/webtbs/tw3589.pp svneol=native#text/plain
 tests/webtbs/tw3594.pp svneol=native#text/plain
 tests/webtbs/tw3595.pp svneol=native#text/plain

+ 1 - 0
rtl/amicommon/sysutils.pp

@@ -955,4 +955,5 @@ Initialization
   RefreshDeviceList;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/atari/sysutils.pp

@@ -533,4 +533,5 @@ Initialization
 
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/embedded/sysutils.pp

@@ -292,4 +292,5 @@ Initialization
   InitExceptions;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/emx/sysutils.pp

@@ -1341,4 +1341,5 @@ Initialization
   InitInternational;    { Initialize internationalization settings }
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/gba/sysutils.pp

@@ -326,4 +326,5 @@ Initialization
   InitExceptions;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/go32v2/sysutils.pp

@@ -921,4 +921,5 @@ Initialization
   OnBeep:=@SysBeep;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/macos/sysutils.pp

@@ -850,4 +850,5 @@ Initialization
   InitInternational;    { Initialize internationalization settings }
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/msdos/sysutils.pp

@@ -930,4 +930,5 @@ Initialization
   OnBeep:=@SysBeep;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/nativent/sysutils.pp

@@ -1264,4 +1264,5 @@ initialization
   OnBeep := @SysBeep;
 finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/nds/sysutils.pp

@@ -365,4 +365,5 @@ Initialization
   InitExceptions;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/netware/sysutils.pp

@@ -662,4 +662,5 @@ Initialization
   OnBeep:=@SysBeep;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/netwlibc/sysutils.pp

@@ -729,4 +729,5 @@ Initialization
   InitInternational;    { Initialize internationalization settings }
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 13 - 0
rtl/objpas/sysutils/sysutils.inc

@@ -653,6 +653,19 @@ begin
     end;
 end;
 
+procedure FreeTerminateProcs;
+var
+  TPR1, TPR2: PPRecord;
+begin
+  TPR1 := TPList;
+  TPList := Nil;
+  while Assigned(TPR1) do begin
+    TPR2 := TPR1^.NextFunc;
+    Dispose(TPR1);
+    TPR1 := TPR2;
+  end;
+end;
+
 { ---------------------------------------------------------------------
     Diskh functions, OS independent.
   ---------------------------------------------------------------------}

+ 1 - 0
rtl/os2/sysutils.pp

@@ -1004,4 +1004,5 @@ Initialization
   OrigOSErrorWatch := TOSErrorWatch (SetOSErrorTracking (@TrackLastOSError));
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/symbian/sysutils.pp

@@ -292,4 +292,5 @@ Initialization
   InitExceptions;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/unix/sysutils.pp

@@ -1664,4 +1664,5 @@ Initialization
 Finalization
   FreeDriveStr;
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/watcom/sysutils.pp

@@ -899,4 +899,5 @@ Initialization
   InitDelay;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/wii/sysutils.pp

@@ -295,4 +295,5 @@ Initialization
   InitExceptions;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/win/sysutils.pp

@@ -1659,4 +1659,5 @@ Initialization
   OnBeep:=@SysBeep;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/win16/sysutils.pp

@@ -952,4 +952,5 @@ Initialization
   OnBeep:=@SysBeep;
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 end.

+ 1 - 0
rtl/wince/sysutils.pp

@@ -983,5 +983,6 @@ Initialization
 
 Finalization
   DoneExceptions;
+  FreeTerminateProcs;
 
 end.

+ 22 - 0
tests/webtbs/tw35862.pp

@@ -0,0 +1,22 @@
+{ %OPT=-gh }
+
+program tw35862;
+
+{$modeswitch result}
+
+uses sysutils;
+
+function do_term:boolean;
+begin
+  writeln('In terminate proc');
+  Result:=true;
+end;
+
+begin
+  HaltOnNotReleased:=True;
+
+  writeln('Adding terminate proc');
+  AddTerminateproc(@do_term);
+  writeln('terminating');
+  CallterminateProcs;
+end.