SMTPClient: Relaying: add safeguard we don't try to attempt to deliver directly.
authorWilfried Goesgens <dothebart@citadel.org>
Thu, 12 Jul 2012 21:33:07 +0000 (23:33 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Thu, 12 Jul 2012 21:33:07 +0000 (23:33 +0200)
citadel/modules/smtp/serv_smtpeventclient.c
citadel/modules/smtp/serv_smtpqueue.c
citadel/modules/smtp/smtpqueue.h

index 56deb4f5034f1785952ea0e6cf6ca4b6830bfdb9..9e97dda97aed2e8660abb7b31cf1d46b3d0e83f1 100644 (file)
@@ -237,6 +237,13 @@ eNextState FailOneAttempt(AsyncIO *IO)
 
        if (Msg->pCurrRelay != NULL)
                Msg->pCurrRelay = Msg->pCurrRelay->Next;
+       if ((Msg->pCurrRelay != NULL) &&
+           !Msg->pCurrRelay->IsRelay &&
+           Msg->MyQItem->HaveRelay)
+       {
+               EVS_syslog(LOG_DEBUG, "%s Aborting; last relay failed.\n", __FUNCTION__);
+               return eAbort;
+       }
 
        if (Msg->pCurrRelay == NULL) {
                EVS_syslog(LOG_DEBUG, "%s Aborting\n", __FUNCTION__);
index 2430d0db8a76f24f2a2cca9fe0815d2331358c8d..0fa9956b0441c8e191117e86e137d8569307e2fe 100644 (file)
@@ -837,7 +837,8 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
                                }
                                else {
                                        ///if (!Url->IsIP)) // todo dupe me fork ipv6
-                                       Url = &(*Url)->Next;
+                                       (*Url)->IsRelay = 1;
+                                       MyQItem->HaveRelay = 1;
                                }
                        }
                        FreeStrBuf(&All);
@@ -863,8 +864,10 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
                                                     "Failed to parse: %s\n",
                                                     ChrPtr(One));
                                }
-                               else
-                                       Url = &(*Url)->Next;
+                               else {
+                                       (*Url)->IsRelay = 1;
+                                       MyQItem->HaveRelay = 1;
+                               }
                        }
                        FreeStrBuf(&All);
                        FreeStrBuf(&One);
index 288e8b2e9b97bd5d0d5c3b54a2d7cb0a48061653..322e45efd5eefd465ef052361f7f5ed97ca66535 100644 (file)
@@ -63,6 +63,7 @@ typedef struct queueitem {
        StrBuf *SenderRoom;
        ParsedURL *URL;
        ParsedURL *FallBackHost;
+       int HaveRelay;
 } OneQueItem;
 
 typedef void (*QItemHandler)(OneQueItem *Item, StrBuf *Line, const char **Pos);