I found that SmtpProt (v5, v5 beta, and v6 beta) has a memory leak in
TSmtpCli.PrepareEMail.  Memory is allocated but not released for each email
Sent:
   unencoded: slightly larger than the body of the email,
   encoded: slightly larger than twice the body of the email.

The current source is:
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*}
procedure TSmtpCli.PrepareEMail;
{var
    I : Integer;}
begin
    FBodyFlag    := TRUE;
    FCurrentFile := 0;
    FBodyLine    := 0;
    FFileStarted := FALSE;
    FEncoding    := FDefaultEncoding;                                   {AG}
    {AG start}
    { FMailMessage.Text is being encoded/wrapped later on the fly,      }
    { see also TriggerGetData and DoGetMsgTextLine                      }
    {if Length(FMailMessage.Text) > 0 then} { FP 05/03/06 }
    if FMailMessage.GetText^ <> #0 then
        FMailMsgTextPos := 1
    else
        FMailMsgTextPos := 0;

    { Check if we have to change Encoding.                              }
    if (FMailMsgTextPos > 0) and
       (FEncoding in [smtpEnc7bit, smtpEnc8bit]) and (not FAllow8bitChars)
then
       if NeedsEncodingPChar(FMailMessage.GetText) then {FP}
        if NeedsEncoding(FMailMessage.Text) then                       
            FEncoding := smtpEncQuotedPrintable;
    {AG end}
...
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*}

The "GetText" is the culprit, it is described in Delphi help for
TStrings.GetText: "Call GetText to obtain a dynamically allocated character
buffer containing all of the strings in the list. Individual strings are
separated by a carriage return and (on Windows) line feed. The caller is
responsible for freeing the returned value using the StrDispose procedure."
A pointer to the buffer created by GetText was not saved so you could not
free it.

The problem can be fixed one of two ways: 1) store the pointer to the 
Character buffer then free it when it is no longer needed, or 2) or change 
the code as follows:
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*}
procedure TSmtpCli.PrepareEMail;
{var
    I : Integer;}
begin
    FBodyFlag    := TRUE;
    FCurrentFile := 0;
    FBodyLine    := 0;
    FFileStarted := FALSE;
    FEncoding    := FDefaultEncoding;                                   {AG}
    {AG start}
    { FMailMessage.Text is being encoded/wrapped later on the fly,      }
    { see also TriggerGetData and DoGetMsgTextLine                      }
    {if Length(FMailMessage.Text) > 0 then} { FP 05/03/06 }
//CE    if FMailMessage.GetText^ <> #0 then
    if FMailMessage.Count > 0 then                                      //CE 
        FMailMsgTextPos := 1
    else
        FMailMsgTextPos := 0;

    { Check if we have to change Encoding.                              }
    if (FMailMsgTextPos > 0) and
       (FEncoding in [smtpEnc7bit, smtpEnc8bit]) and (not FAllow8bitChars)
then
//CE       if NeedsEncodingPChar(FMailMessage.GetText) then {FP}
       if NeedsEncoding(FMailMessage.Text) then {FP}                    //CE 
        if NeedsEncoding(FMailMessage.Text) then                       
            FEncoding := smtpEncQuotedPrintable;
    {AG end}
...
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*}

Carl Efird 



-- 
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to