The attached patch fixes the problem for me. It changes the relevant
smtpd_resolve_addr() call in smtpd_check.c to use the message sender.
diff --git a/src/smtpd/smtpd_check.c b/src/smtpd/smtpd_check.c
index 74e42d7..2d8c6b7 100644
--- a/src/smtpd/smtpd_check.c
+++ b/src/smtpd/smtpd_check.c
@@ -5108,7 +5108,8 @@ static int check_rcpt_maps(SMTPD_STATE *state, const char *recipient,
/*
* Resolve the address.
*/
- reply = smtpd_resolve_addr(recipient);
+ reply = smtpd_resolve_addr_from(state->sender, recipient);
+
if (reply->flags & RESOLVE_FLAG_FAIL)
reject_dict_retry(state, recipient);
diff --git a/src/smtpd/smtpd_resolve.c b/src/smtpd/smtpd_resolve.c
index 7cd8e4c..3eb06cc 100644
--- a/src/smtpd/smtpd_resolve.c
+++ b/src/smtpd/smtpd_resolve.c
@@ -11,6 +11,10 @@
/*
/* const RESOLVE_REPLY *smtpd_resolve_addr(addr)
/* const char *addr;
+/*
+/* const RESOLVE_REPLY *smtpd_resolve_addr_from(sender, addr)
+/* const char *sender;
+/* const char *addr;
/* DESCRIPTION
/* This module maintains a resolve client cache that persists
/* across SMTP sessions (not process life times). Addresses
@@ -26,6 +30,8 @@
/* Arguments:
/* .IP cache_size
/* The requested cache size.
+/* .IP sender
+/* The message sender.
/* .IP addr
/* The address to resolve.
/* DIAGNOSTICS
@@ -70,15 +76,29 @@
static CTABLE *smtpd_resolve_cache;
#define STR(x) vstring_str(x)
+#define SENDER_SEPARATOR 1
/* resolve_pagein - page in an address resolver result */
-static void *resolve_pagein(const char *addr, void *unused_context)
+static void *resolve_pagein(const char* key, void *unused_context)
{
static VSTRING *query;
RESOLVE_REPLY *reply;
+ const char *addr;
+ char *sender;
char *tmp;
+ tmp = strchr(key, SENDER_SEPARATOR);
+ if (tmp == 0) {
+ addr = key;
+ sender = 0;
+ } else {
+ addr = tmp + 1;
+ sender = mymalloc(addr - key);
+ memcpy(sender, key, tmp - key);
+ sender[tmp - key] = '\0';
+ }
+
/*
* Initialize on the fly.
*/
@@ -95,7 +115,11 @@ static void *resolve_pagein(const char *addr, void *unused_context)
* Resolve the address.
*/
rewrite_clnt_internal(MAIL_ATTR_RWR_LOCAL, addr, query);
- resolve_clnt_query(STR(query), reply);
+ if (sender == 0) {
+ resolve_clnt_query(STR(query), reply);
+ } else {
+ resolve_clnt_query_from(sender, STR(query), reply);
+ }
tmp = mystrdup(STR(reply->recipient));
casefold(reply->recipient, tmp); /* XXX */
myfree(tmp);
@@ -140,6 +164,17 @@ void smtpd_resolve_init(int cache_size)
const RESOLVE_REPLY *smtpd_resolve_addr(const char *addr)
{
+ return smtpd_resolve_addr_from(0, addr);
+}
+
+/* smtpd_resolve_addr_from - resolve cached address */
+
+const RESOLVE_REPLY *smtpd_resolve_addr_from(const char *sender, const char *addr)
+{
+ void *reply;
+ size_t sender_len;
+ size_t addr_len;
+ char *key;
/*
* Sanity check.
@@ -150,5 +185,18 @@ const RESOLVE_REPLY *smtpd_resolve_addr(const char *addr)
/*
* Reply from the read-through cache.
*/
- return (const RESOLVE_REPLY *) ctable_locate(smtpd_resolve_cache, addr);
+ if (sender == 0) {
+ reply = ctable_locate(smtpd_resolve_cache, addr);
+ } else {
+ sender_len = strlen(sender);
+ addr_len = strlen(addr);
+ key = mymalloc(sender_len + addr_len + 2);
+ memcpy(key, sender, sender_len);
+ key[sender_len] = SENDER_SEPARATOR;
+ memcpy(key + sender_len + 1, addr, addr_len + 1);
+ reply = ctable_locate(smtpd_resolve_cache, key);
+ myfree(key);
+ }
+
+ return (const RESOLVE_REPLY *)reply;
}
diff --git a/src/smtpd/smtpd_resolve.h b/src/smtpd/smtpd_resolve.h
index bfbc494..235e66a 100644
--- a/src/smtpd/smtpd_resolve.h
+++ b/src/smtpd/smtpd_resolve.h
@@ -18,6 +18,7 @@
*/
extern void smtpd_resolve_init(int);
extern const RESOLVE_REPLY *smtpd_resolve_addr(const char *);
+extern const RESOLVE_REPLY *smtpd_resolve_addr_from(const char*, const char *);
/* LICENSE
/* .ad