summaryrefslogtreecommitdiffstats
path: root/rfc1035
diff options
context:
space:
mode:
authorSam Varshavchik2015-06-27 13:26:50 -0400
committerSam Varshavchik2015-06-27 13:26:50 -0400
commit174541a2e670c0ee70fd2fb3116209f96ecc173e (patch)
treeab31a41aca11ccad42c120ff0abe7e32fd29762f /rfc1035
parent67b9324b4d78f3fc5cb92e0b024c1c5cfca5a39b (diff)
downloadcourier-libs-174541a2e670c0ee70fd2fb3116209f96ecc173e.tar.bz2
Fix some bounds checking issues. Added ESMTP_PREFER_IPV6_MX setting.
Diffstat (limited to 'rfc1035')
-rw-r--r--rfc1035/rfc1035mxlist.c36
-rw-r--r--rfc1035/rfc1035search.c2
2 files changed, 24 insertions, 14 deletions
diff --git a/rfc1035/rfc1035mxlist.c b/rfc1035/rfc1035mxlist.c
index 527aab4..2608a02 100644
--- a/rfc1035/rfc1035mxlist.c
+++ b/rfc1035/rfc1035mxlist.c
@@ -90,12 +90,15 @@ static int add_arecords(struct rfc1035_res *res, struct rfc1035_mxlist **list,
char *mxname, int port, int opts)
{
#if RFC1035_IPV6
-struct in6_addr in;
+ struct in6_addr in;
+ int first_a=RFC1035_TYPE_A;
+ int second_a=RFC1035_TYPE_AAAA;
+ const char *prefer_ipv6=getenv("ESMTP_PREFER_IPV6_MX");
#else
-struct in_addr in;
+ struct in_addr in;
#endif
-int found=0;
-int rc;
+ int found=0;
+ int rc;
if (rfc1035_aton(mxname, &in) == 0)
{ /* Broken MX record */
@@ -123,29 +126,36 @@ records, then query for A records. Query for AAAA records only if A
records weren't found.
*/
+ if (prefer_ipv6 && *prefer_ipv6 && *prefer_ipv6 != '0')
+ {
+ first_a=RFC1035_TYPE_AAAA;
+ second_a=RFC1035_TYPE_A;
+ }
+
if (mxreply && !(opts & RFC1035_MX_QUERYALL))
{
if ((rc=harvest_records(res, list, mxreply, mxpreference,
- mxname, RFC1035_TYPE_AAAA, &found, 0, port))
- != RFC1035_MX_OK)
+ mxname, second_a, &found, HARVEST_NODUPE,
+ port))
+ != RFC1035_MX_OK)
return (rc);
if ((rc=harvest_records(res, list, mxreply, mxpreference,
- mxname, RFC1035_TYPE_A, &found, HARVEST_NODUPE,
- port))
- != RFC1035_MX_OK)
+ mxname, first_a, &found, 0, port))
+ != RFC1035_MX_OK)
return (rc);
+
if (found) return (RFC1035_MX_OK);
}
if ((rc=harvest_records(res, list, mxreply, mxpreference, mxname,
- RFC1035_TYPE_AAAA, &found, HARVEST_AUTOQUERY, port))
- != RFC1035_MX_OK)
+ second_a, &found, HARVEST_AUTOQUERY|HARVEST_NODUPE, port))
+ != RFC1035_MX_OK)
return (rc);
if ((rc=harvest_records(res, list, mxreply, mxpreference, mxname,
- RFC1035_TYPE_A, &found, HARVEST_AUTOQUERY|HARVEST_NODUPE, port))
- != RFC1035_MX_OK)
+ first_a, &found, HARVEST_AUTOQUERY, port))
+ != RFC1035_MX_OK)
return (rc);
if (found) return (RFC1035_MX_OK);
diff --git a/rfc1035/rfc1035search.c b/rfc1035/rfc1035search.c
index 8e69ad4..019f521 100644
--- a/rfc1035/rfc1035search.c
+++ b/rfc1035/rfc1035search.c
@@ -154,7 +154,7 @@ int recursion_count=10;
namebuf, qtype, qclass)) == 0)
return (-1);
- if (x_flags && RFC1035_X_RANDOMIZE &&
+ if ((x_flags & RFC1035_X_RANDOMIZE) &&
(*ptr)->rcode == RFC1035_RCODE_NOERROR)
rfc1035_rr_rand(*ptr);