From ebb74077eee67e729300b3be193482192975fa19 Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 15 Oct 2018 13:58:07 +0200 Subject: plus addressing improvements * first `+` splits local part from sub-address * prioritize plus addressing over domain wildcards --- realrcptto.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'realrcptto.c') diff --git a/realrcptto.c b/realrcptto.c index 93a7aad..0f275ba 100644 --- a/realrcptto.c +++ b/realrcptto.c @@ -173,17 +173,20 @@ static char *virtualext(stralloc *localpart, unsigned int at) unsigned int i; char *x; - for (i = at; i > 0; --i) - if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) break; - if (i == 0 || i == at - 1) return NULL; - - if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); - if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); - x = constmap(&mapvdoms, newaddr.s, newaddr.len); - if (!x) return NULL; + /* sub-addressing: ignore first and last character in local part */ + for (i = 1; i < at - 1; ++i) { + if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) { + if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); + if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); + x = constmap(&mapvdoms, newaddr.s, newaddr.len); + if (!x) return NULL; + + localpart->s[i] = '-'; + return x; + } + } - localpart->s[i] = '-'; - return x; + return NULL; } // max lookups -- cgit v1.2.3