Filter out zero-length MX records
[citadel.git] / citadel / domain.c
index af0af3d45eacb606d084b027fc8fcc659b8aaa92..3c4f1455c375d03693a93b349db36b4bb32c9ec3 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * DNS lookup for SMTP sender
  *
- * Copyright (c) 1987-2017 by the citadel.org team
+ * Copyright (c) 1987-2021 by the citadel.org team
  *
  * This program is open source software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, version 3.
@@ -115,12 +115,14 @@ int getmx(char *mxbuf, char *dest) {
 
        struct mx *mxrecs = NULL;
        int num_mxrecs = 0;
-       
+
        /* If we're configured to send all mail to a smart-host, then our
         * job here is really easy.
         */
        n = get_hosts(mxbuf, "smarthost");
-       if (n > 0) return(n);
+       if (n > 0) {
+               return(n);
+       }
 
        /*
         * No smart-host?  Look up the best MX for a site.
@@ -136,7 +138,6 @@ int getmx(char *mxbuf, char *dest) {
                num_mxrecs = 1;
        }
        else {
-
                /* If we had to truncate, shrink the number to avoid fireworks */
                if (ret > sizeof(answer)) {
                        ret = sizeof(answer);
@@ -148,7 +149,7 @@ int getmx(char *mxbuf, char *dest) {
        
                for (qdcount = ntohs(answer.header.qdcount); qdcount--; ptr += ret + QFIXEDSZ) {
                        if ((ret = dn_skipname(ptr, endptr)) < 0) {
-                               syslog(LOG_DEBUG, "dn_skipname error\n");
+                               syslog(LOG_DEBUG, "domain: dn_skipname error");
                                return(0);
                        }
                }
@@ -172,16 +173,20 @@ int getmx(char *mxbuf, char *dest) {
                                ret = dn_expand(startptr, endptr, ptr, expanded_buf, sizeof(expanded_buf));
                                ptr += ret;
        
-                               ++num_mxrecs;
-                               if (mxrecs == NULL) {
-                                       mxrecs = malloc(sizeof(struct mx));
-                               }
-                               else {
-                                       mxrecs = realloc(mxrecs, (sizeof(struct mx) * num_mxrecs) );
-                               }
+                               // If there are no MX records for the domain, resolv will give us a single one with zero length.
+                               // Make sure we only record actual MX records and not the blank.
+                               if (strlen(expanded_buf) > 0) {
+                                       ++num_mxrecs;
+                                       if (mxrecs == NULL) {
+                                               mxrecs = malloc(sizeof(struct mx));
+                                       }
+                                       else {
+                                               mxrecs = realloc(mxrecs, (sizeof(struct mx) * num_mxrecs) );
+                                       }
        
-                               mxrecs[num_mxrecs - 1].pref = pref;
-                               strcpy(mxrecs[num_mxrecs - 1].host, expanded_buf);
+                                       mxrecs[num_mxrecs - 1].pref = pref;
+                                       strcpy(mxrecs[num_mxrecs - 1].host, expanded_buf);
+                               }
                        }
                }
        }