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

Reply via email to