From 81c6612b5c71982c28057c30c42ce4cbb8120eaf Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Thu, 12 Jul 2012 23:33:07 +0200 Subject: [PATCH] SMTPClient: Relaying: add safeguard we don't try to attempt to deliver directly. --- citadel/modules/smtp/serv_smtpeventclient.c | 7 +++++++ citadel/modules/smtp/serv_smtpqueue.c | 9 ++++++--- citadel/modules/smtp/smtpqueue.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index 56deb4f50..9e97dda97 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -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__); diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index 2430d0db8..0fa9956b0 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -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); diff --git a/citadel/modules/smtp/smtpqueue.h b/citadel/modules/smtp/smtpqueue.h index 288e8b2e9..322e45efd 100644 --- a/citadel/modules/smtp/smtpqueue.h +++ b/citadel/modules/smtp/smtpqueue.h @@ -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); -- 2.30.2