Avoid memory leaks when using TRelayer
authorMegaBrutal <code+git@megabrutal.com>
Wed, 21 Nov 2018 17:00:15 +0000 (18:00 +0100)
committerMegaBrutal <code+git@megabrutal.com>
Wed, 21 Nov 2018 17:00:15 +0000 (18:00 +0100)
Ensure to free TTCPRFCConnection and TRelayer instance when
TRelayer.OpenConnection fails.

modified:   Relay.pas
modified:   Spool.pas

Relay.pas
Spool.pas

index bcbcc9d92ee6842c5de66b050df69c6890e949e1..017d943b22463595f184cf51911f176ea112bca5 100644 (file)
--- a/Relay.pas
+++ b/Relay.pas
@@ -176,6 +176,7 @@ begin
    FTransactionComplete:= false;
    FRoutingTarget:= RoutingTable.GetRouteInfo(Envelope.RelayHost);
    Response:= TRFCReply.Create;
+   TCP:= nil;
    FillChar(SMTPExtensions, SizeOf(TSMTPExtensions), #0);
 end;
 
@@ -183,6 +184,7 @@ destructor TRelayer.Destroy;
 begin
    FRoutingTarget.Free;
    Response.Free;
+   if TCP <> nil then TCP.Free;
    inherited Destroy;
 end;
 
@@ -340,6 +342,7 @@ begin
          Inc(i);
       end;
       Result:= TCP.Connected;
+      if not TCP.Connected then FreeAndNil(TCP);
    end
    else Result:= false;
    MXList.Free;
@@ -539,7 +542,7 @@ procedure TRelayer.CloseConnection;
 begin
    TCP.SendCommand(SMTP_C_QUIT);
    {TCP.ReadResponse(Response);}
-   TCP.Free;
+   FreeAndNil(TCP);
 end;
 
 
index 1e4510192f8dd04f97fbf947dd26e0835523d652..118e367479c19105881dbce9938633734a4f97a4 100644 (file)
--- a/Spool.pas
+++ b/Spool.pas
@@ -1,6 +1,6 @@
 {
    MegaBrutal's SMTP Server (MgSMTP)
-   Copyright (C) 2010-2015 MegaBrutal
+   Copyright (C) 2010-2018 MegaBrutal
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
@@ -873,13 +873,13 @@ begin
 
                         AssignDeliveryStatusToSMTPCodes(CurrEnv, Relayer.IsTransactionComplete);
                         Relayer.CloseConnection;
-                        Relayer.Free;
                         HandleDeliveryResults(SpoolObject, false, CurrEnv, FailEnv, 0, '');
                      end
                      else begin
                         HandleDeliveryResults(SpoolObject, false, CurrEnv, FailEnv, DS_DELAYED or DS_CONNECTIONFAIL, DSMSG_CONNECTIONFAIL + Relayer.RelayServerName);
                      end;
-                     { Free envelope. }
+                     { Free relayer and envelope. }
+                     Relayer.Free;
                      CurrEnv.Free;
                   end;