libev migration: check pointer before free'ing it.
[citadel.git] / citadel / modules / smtp / serv_smtpqueue.c
index 4115cb5223e6b36fe34e7e00097174928a3db3e5..b4ab587407bf325871d50ed0375229d79b0eaf16 100644 (file)
@@ -138,7 +138,16 @@ void RemoveQItem(OneQueItem *MyQItem)
        DeleteHashPos(&It);
 }
 
-
+void FreeURL(ParsedURL** Url)
+{
+       if (*Url != NULL) {
+               FreeStrBuf(&(*Url)->URL);
+               if ((*Url)->Next != NULL)
+                       FreeURL(&(*Url)->Next);
+               free(*Url);
+               *Url = NULL;
+       }
+}
 
 void FreeMailQEntry(void *qv)
 {
@@ -152,6 +161,7 @@ void FreeQueItem(OneQueItem **Item)
        DeleteHash(&(*Item)->MailQEntries);
        FreeStrBuf(&(*Item)->EnvelopeFrom);
        FreeStrBuf(&(*Item)->BounceTo);
+       FreeURL(&(*Item)->URL);
        free(*Item);
        Item = NULL;
 }
@@ -593,7 +603,7 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt)
 
 int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort)
 {
-       const char *pch, *pStartHost, *pEndHost, *pPort, *pCredEnd, *pUserEnd;
+       const char *pch, *pEndHost, *pPort, *pCredEnd, *pUserEnd;
        ParsedURL *url = (ParsedURL *)malloc(sizeof(ParsedURL));
        memset(url, 0, sizeof(ParsedURL));
 
@@ -603,17 +613,17 @@ int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort)
         * http://username:passvoid@[ipv6]:port/url 
         */
        url->URL = NewStrBufDup(UrlStr);
-       pStartHost = pch = ChrPtr(url->URL);
+       url->Host = pch = ChrPtr(url->URL);
        url->LocalPart = strchr(pch, '/');
        if (url->LocalPart != NULL) {
                if ((*(url->LocalPart + 1) == '/') && 
                    (*(url->LocalPart + 2) == ':')) { /* TODO: find default port for this protocol... */
-                       pStartHost = url->LocalPart + 3;
-                       url->LocalPart = strchr(pStartHost, '/');
+                       url->Host = url->LocalPart + 3;
+                       url->LocalPart = strchr(url->Host, '/');
                }
        }
        if (url->LocalPart == NULL) {
-               url->LocalPart = pch + StrLength(UrlStr);
+               url->LocalPart = pch + StrLength(url->URL);
        }
 
        pCredEnd = strchr(pch, '@');
@@ -621,8 +631,8 @@ int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort)
                pCredEnd = NULL;
        if (pCredEnd != NULL)
        {
-               url->User = pStartHost;
-               pStartHost = pCredEnd + 1;
+               url->User = url->Host;
+               url->Host = pCredEnd + 1;
                pUserEnd = strchr(url->User, ':');
                
                if (pUserEnd > pCredEnd)
@@ -630,30 +640,35 @@ int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort)
                else {
                        url->Pass = pUserEnd + 1;
                }
-               StrBufPeek(UrlStr, pUserEnd, 0, '\0');
-               StrBufPeek(UrlStr, pCredEnd, 0, '\0');          
+               StrBufPeek(url->URL, pUserEnd, 0, '\0');
+               StrBufPeek(url->URL, pCredEnd, 0, '\0');                
        }
        
        pPort = NULL;
-       if (*pStartHost == '[') {
-               pStartHost ++;
-               pEndHost = strchr(pStartHost, ']');
+       if (*url->Host == '[') {
+               url->Host ++;
+               pEndHost = strchr(url->Host, ']');
                if (pEndHost == NULL) {
                        free(url);
                        return 0; /* invalid syntax, no ipv6 */
                }
-               if (*(pEndHost + 1) == ':')
+               if (*(pEndHost + 1) == ':'){
+                       StrBufPeek(url->URL, pEndHost + 1, 0, '\0');
                        pPort = pEndHost + 2;
+               }
                url->af = AF_INET6;
        }
        else {
-               pPort = strchr(pStartHost, ':');
-               if (pPort != NULL)
+               pPort = strchr(url->Host, ':');
+               if (pPort != NULL) {
+                       StrBufPeek(url->URL, pPort, 0, '\0');
                        pPort ++;
+               }
        }
        if (pPort != NULL)
                url->Port = atol(pPort);
-       url->IsIP = inet_pton(url->af, pStartHost, &url->Addr); 
+       url->IsIP = inet_pton(url->af, url->Host, &url->Addr);
+       *Url = url;
        return 1;
 }
 /*
@@ -749,7 +764,7 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
 
        {
                char mxbuf[SIZ];
-               ParsedURL **Url = &RelayUrls; ///&MyQItem->Relay;
+               ParsedURL **Url = &MyQItem->URL;
                nRelays = get_hosts(mxbuf, "smarthost");
                if (nRelays > 0) {
                        StrBuf *All;
@@ -758,13 +773,15 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
                        All = NewStrBufPlain(mxbuf, -1);
                        One = NewStrBufPlain(NULL, StrLength(All) + 1);
                        
-                       while (Pos != StrBufNOTNULL) {
+                       while ((Pos != StrBufNOTNULL) && ((Pos == NULL) || !IsEmptyStr(Pos))) {
                                StrBufExtract_NextToken(One, All, &Pos, '|');
                                if (!ParseURL(Url, One, 25))
                                        CtdlLogPrintf(CTDL_DEBUG, "Failed to parse: %s\n", ChrPtr(One));
                                else 
                                        Url = &(*Url)->Next;
                        }
+                       FreeStrBuf(&All);
+                       FreeStrBuf(&One);
                }
        }