]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/smtp/serv_smtpeventclient.c
Memleak: free the vector of URLs to try to connect to.
[citadel.git] / citadel / modules / smtp / serv_smtpeventclient.c
index a2913bb9b23d57a2024c16f1c970c5572170cf95..c8b5ba166a5227d243650503e706b0244a88d81b 100644 (file)
@@ -99,8 +99,10 @@ void DeleteSmtpOutMsg(void *v)
        ares_free_data(Msg->AllMX);
        if (Msg->HostLookup.VParsedDNSReply != NULL)
                Msg->HostLookup.DNSReplyFree(Msg->HostLookup.VParsedDNSReply);
+       FreeURL(&Msg->Relay);
        FreeStrBuf(&Msg->msgtext);
        FreeAsyncIOContents(&Msg->IO);
+       memset (Msg, 0, sizeof(SmtpOutMsg)); /* just to be shure... */
        free(Msg);
 }
 
@@ -170,8 +172,11 @@ eNextState FailOneAttempt(AsyncIO *IO)
         * possible ways here: 
         * - connection timeout 
         * - 
-        */     
-       SendMsg->pCurrRelay = SendMsg->pCurrRelay->Next;
+        */
+       StopClientWatchers(IO);
+
+       if (SendMsg->pCurrRelay != NULL)
+               SendMsg->pCurrRelay = SendMsg->pCurrRelay->Next;
 
        if (SendMsg->pCurrRelay == NULL)
                return eAbort;
@@ -206,7 +211,7 @@ void SetConnectStatus(AsyncIO *IO)
                  sizeof(buf));
 
        if (SendMsg->mx_host == NULL)
-               SendMsg->mx_host = "<no name>";
+               SendMsg->mx_host = "<no MX-Record>";
 
        CtdlLogPrintf(CTDL_DEBUG, 
                      "SMTP client[%ld]: connecting to %s [%s]:%d ...\n", 
@@ -221,6 +226,7 @@ void SetConnectStatus(AsyncIO *IO)
                     SendMsg->mx_host,
                     buf,
                     SendMsg->IO.ConnectMe->Port);
+       SendMsg->IO.NextState = eConnect;
 }
 
 /*****************************************************************************
@@ -274,6 +280,7 @@ eNextState get_one_mx_host_ip_done(AsyncIO *IO)
                        addr->sin_port   = htons(DefaultMXPort);
                        
                }
+               SendMsg->mx_host = SendMsg->pCurrRelay->Host;
                return mx_connect_ip(IO);
        }
        else // TODO: here we need to find out whether there are more mx'es, backup relay, and so on
@@ -295,8 +302,9 @@ eNextState get_one_mx_host_ip(AsyncIO *IO)
        CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
 
        CtdlLogPrintf(CTDL_DEBUG, 
-                     "SMTP client[%ld]: looking up %s : %d ...\n", 
+                     "SMTP client[%ld]: looking up %s-Record %s : %d ...\n", 
                      SendMsg->n, 
+                     (SendMsg->pCurrRelay->IPv6)? "aaaa": "a",
                      SendMsg->pCurrRelay->Host, 
                      SendMsg->pCurrRelay->Port);
 
@@ -309,8 +317,10 @@ eNextState get_one_mx_host_ip(AsyncIO *IO)
                SendMsg->MyQEntry->Status = 5;
                StrBufPrintf(SendMsg->MyQEntry->StatusMessage, 
                             "No MX hosts found for <%s>", SendMsg->node);
+               SendMsg->IO.NextState = eTerminateConnection;
                return IO->NextState;
        }
+       IO->NextState = eReadDNSReply;
        return IO->NextState;
 }
 
@@ -395,7 +405,8 @@ eNextState resolve_mx_records(AsyncIO *IO)
                             "No MX hosts found for <%s>", SendMsg->node);
                return IO->NextState;
        }
-       return eAbort;
+       SendMsg->IO.NextState = eReadDNSReply;
+       return IO->NextState;
 }
 
 
@@ -494,8 +505,10 @@ void smtp_try_one_queue_entry(OneQueItem *MyQItem,
 
 void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *pMsg)
 {
+       double Timeout = 0.0;
+
        CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
-       double Timeout;
+
        switch (NextTCPState) {
        case eSendReply:
        case eSendMore:
@@ -515,6 +528,9 @@ void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *pMsg)
                        Timeout += StrLength(pMsg->msgtext) / 1024;
                }
                break;
+       case eSendDNSQuery:
+       case eReadDNSReply:
+       case eConnect:
        case eTerminateConnection:
        case eAbort:
                return;