Bläddra i källkod

* Fixed memory leak when reading fastcgi records

git-svn-id: trunk@15863 -
michael 15 år sedan
förälder
incheckning
6f1dfa1353
1 ändrade filer med 28 tillägg och 26 borttagningar
  1. 28 26
      packages/fcl-web/src/base/custfcgi.pp

+ 28 - 26
packages/fcl-web/src/base/custfcgi.pp

@@ -525,34 +525,36 @@ begin
   repeat
   AFCGI_Record:=Read_FCGIRecord;
   if assigned(AFCGI_Record) then
-    begin
-    ARequestID:=BEtoN(AFCGI_Record^.requestID);
-    if AFCGI_Record^.reqtype = FCGI_BEGIN_REQUEST then
-      begin
-      if ARequestID>FRequestsAvail then
+    try
+      ARequestID:=BEtoN(AFCGI_Record^.requestID);
+      if AFCGI_Record^.reqtype = FCGI_BEGIN_REQUEST then
         begin
-        inc(FRequestsAvail,10);
-        SetLength(FRequestsArray,FRequestsAvail);
+        if ARequestID>FRequestsAvail then
+          begin
+          inc(FRequestsAvail,10);
+          SetLength(FRequestsArray,FRequestsAvail);
+          end;
+        assert(not assigned(FRequestsArray[ARequestID].Request));
+        assert(not assigned(FRequestsArray[ARequestID].Response));
+
+        ATempRequest:=TFCGIRequest.Create;
+        ATempRequest.RequestID:=ARequestID;
+        ATempRequest.Handle:=FHandle;
+        ATempRequest.ProtocolOptions:=Self.Protocoloptions;
+        ATempRequest.OnUnknownRecord:=Self.OnUnknownRecord;
+        FRequestsArray[ARequestID].Request := ATempRequest;
         end;
-      assert(not assigned(FRequestsArray[ARequestID].Request));
-      assert(not assigned(FRequestsArray[ARequestID].Response));
-
-      ATempRequest:=TFCGIRequest.Create;
-      ATempRequest.RequestID:=ARequestID;
-      ATempRequest.Handle:=FHandle;
-      ATempRequest.ProtocolOptions:=Self.Protocoloptions;
-      ATempRequest.OnUnknownRecord:=Self.OnUnknownRecord;
-      FRequestsArray[ARequestID].Request := ATempRequest;
-      end;
-    if FRequestsArray[ARequestID].Request.ProcessFCGIRecord(AFCGI_Record) then
-      begin
-      ARequest:=FRequestsArray[ARequestID].Request;
-      FRequestsArray[ARequestID].Response := TFCGIResponse.Create(ARequest);
-      FRequestsArray[ARequestID].Response.ProtocolOptions:=Self.ProtocolOptions;
-      AResponse:=FRequestsArray[ARequestID].Response;
-      Result := True;
-      Break;
-      end;
+      if FRequestsArray[ARequestID].Request.ProcessFCGIRecord(AFCGI_Record) then
+        begin
+        ARequest:=FRequestsArray[ARequestID].Request;
+        FRequestsArray[ARequestID].Response := TFCGIResponse.Create(ARequest);
+        FRequestsArray[ARequestID].Response.ProtocolOptions:=Self.ProtocolOptions;
+        AResponse:=FRequestsArray[ARequestID].Response;
+        Result := True;
+        Break;
+        end;
+    Finally
+      FreeMem(AFCGI_Record);
     end;
   until (1<>1);
 end;