/*
* 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.
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.
num_mxrecs = 1;
}
else {
-
/* If we had to truncate, shrink the number to avoid fireworks */
if (ret > sizeof(answer)) {
ret = sizeof(answer);
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);
}
}
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);
+ }
}
}
}