summaryrefslogtreecommitdiffstats
path: root/tcpd/tcpd.c
diff options
context:
space:
mode:
authorSam Varshavchik2020-05-09 09:21:12 -0400
committerSam Varshavchik2020-05-09 09:21:12 -0400
commit8dafc1a01658760fcaf56b14ccc794d8b386f0e2 (patch)
treead742217332f011873fbba13ce976d931ce009a2 /tcpd/tcpd.c
parent1310320b6a0f31307896119968b13341b073bce2 (diff)
downloadcourier-libs-8dafc1a01658760fcaf56b14ccc794d8b386f0e2.tar.bz2
Query for both A and TXT records.
Diffstat (limited to 'tcpd/tcpd.c')
-rw-r--r--tcpd/tcpd.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/tcpd/tcpd.c b/tcpd/tcpd.c
index 094940a..e263ea1 100644
--- a/tcpd/tcpd.c
+++ b/tcpd/tcpd.c
@@ -1,5 +1,5 @@
/*
-** Copyright 1998 - 2013 Double Precision, Inc.
+** Copyright 1998 - 2020 Double Precision, Inc.
** See COPYING for distribution information.
*/
@@ -1603,6 +1603,8 @@ static void docheckblocklist(struct blocklist_s *p, const char *nameptr)
struct rfc1035_res res;
unsigned int i;
int found;
+ unsigned char query_A[] = {RFC1035_TYPE_A, 0},
+ query_A_and_TXT[] = {RFC1035_TYPE_A, RFC1035_TYPE_TXT, 0};
hostname[0]=0;
strncat(hostname, nameptr, RFC1035_MAXNAMESIZE);
@@ -1626,9 +1628,9 @@ static void docheckblocklist(struct blocklist_s *p, const char *nameptr)
else
wanttxt = p->msg && strcmp(p->msg, "*") == 0;
- (void)rfc1035_resolve_cname(&res,
+ (void)rfc1035_resolve_cname_multiple(&res,
hostname,
- wanttxt ? RFC1035_TYPE_TXT:RFC1035_TYPE_A,
+ wanttxt ? query_A_and_TXT:query_A,
RFC1035_CLASS_IN, &replyp, 0);
if (!replyp)
@@ -1670,7 +1672,8 @@ static void docheckblocklist(struct blocklist_s *p, const char *nameptr)
if (p->allow)
set_allow_variable(varname, p->msg);
- if (!search_txt_records(&res, p->allow, varname, replyp,
+ if (replyp->next &&
+ !search_txt_records(&res, p->allow, varname, replyp->next,
hostname) && !p->allow)
{
size_t l=strlen(p->zone)+40;
@@ -1702,9 +1705,9 @@ static void docheckblocklist(struct blocklist_s *p, const char *nameptr)
** for a specific IP address, then take what we've got.
*/
- if (p->ia.s_addr == INADDR_ANY && !found)
+ if (p->ia.s_addr == INADDR_ANY && !found && replyp->next)
{
- if (search_txt_records(&res, p->allow, varname, replyp,
+ if (search_txt_records(&res, p->allow, varname, replyp->next,
hostname))
{
/*