diff options
| author | Sam Varshavchik | 2015-06-27 13:26:50 -0400 |
|---|---|---|
| committer | Sam Varshavchik | 2015-06-27 13:26:50 -0400 |
| commit | 174541a2e670c0ee70fd2fb3116209f96ecc173e (patch) | |
| tree | ab31a41aca11ccad42c120ff0abe7e32fd29762f /rfc1035 | |
| parent | 67b9324b4d78f3fc5cb92e0b024c1c5cfca5a39b (diff) | |
| download | courier-libs-174541a2e670c0ee70fd2fb3116209f96ecc173e.tar.bz2 | |
Fix some bounds checking issues. Added ESMTP_PREFER_IPV6_MX setting.
Diffstat (limited to 'rfc1035')
| -rw-r--r-- | rfc1035/rfc1035mxlist.c | 36 | ||||
| -rw-r--r-- | rfc1035/rfc1035search.c | 2 |
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); |
