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