diff options
| -rw-r--r-- | qmail-send.c | 19 | ||||
| -rw-r--r-- | realrcptto.c | 25 |
2 files changed, 43 insertions, 1 deletions
diff --git a/qmail-send.c b/qmail-send.c index 0baed66..6eac4d5 100644 --- a/qmail-send.c +++ b/qmail-send.c | |||
| @@ -160,6 +160,25 @@ char *recip; | |||
| 160 | return 1; | 160 | return 1; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | static stralloc newaddr = {0}; | ||
| 164 | for (i = at; i > 0; --i) { | ||
| 165 | if (addr.s[i] == '+' /*|| addr.s[i] == '-'*/) { | ||
| 166 | if (i == at - 1) break; | ||
| 167 | if (!stralloc_copyb(&newaddr, addr.s, i)) return 0; | ||
| 168 | if (!stralloc_catb(&newaddr, addr.s + at, addr.len - at)) return 0; | ||
| 169 | if (x = constmap(&mapvdoms, newaddr.s, newaddr.len)) { | ||
| 170 | if (!*x) break; | ||
| 171 | if (!stralloc_cats(&rwline, x)) return 0; | ||
| 172 | if (!stralloc_cats(&rwline, "-")) return 0; | ||
| 173 | addr.s[i] = '-'; | ||
| 174 | if (!stralloc_cat(&rwline, &addr)) return 0; | ||
| 175 | if (!stralloc_0(&rwline)) return 0; | ||
| 176 | return 1; | ||
| 177 | } | ||
| 178 | break; | ||
| 179 | } | ||
| 180 | } | ||
| 181 | |||
| 163 | if (!stralloc_cat(&rwline,&addr)) return 0; | 182 | if (!stralloc_cat(&rwline,&addr)) return 0; |
| 164 | if (!stralloc_0(&rwline)) return 0; | 183 | if (!stralloc_0(&rwline)) return 0; |
| 165 | return 2; | 184 | return 2; |
diff --git a/realrcptto.c b/realrcptto.c index 866bd57..e18a21f 100644 --- a/realrcptto.c +++ b/realrcptto.c | |||
| @@ -165,6 +165,25 @@ static int userext() | |||
| 165 | } | 165 | } |
| 166 | } | 166 | } |
| 167 | 167 | ||
| 168 | static char *virtualext(stralloc *localpart, unsigned int at) | ||
| 169 | { | ||
| 170 | static stralloc newaddr = {0}; | ||
| 171 | unsigned int i; | ||
| 172 | char *x; | ||
| 173 | |||
| 174 | for (i = at; i > 0; --i) | ||
| 175 | if (localpart->s[i] == '+' /*|| localpart->s[i] == '-'*/) break; | ||
| 176 | if (i == 0 || i == at - 1) return NULL; | ||
| 177 | |||
| 178 | if (!stralloc_copyb(&newaddr, localpart->s, i)) die_nomem(); | ||
| 179 | if (!stralloc_catb(&newaddr, localpart->s + at, localpart->len - at)) die_nomem(); | ||
| 180 | x = constmap(&mapvdoms, newaddr.s, newaddr.len); | ||
| 181 | if (!x) return NULL; | ||
| 182 | |||
| 183 | localpart->s[i] = '-'; | ||
| 184 | return x; | ||
| 185 | } | ||
| 186 | |||
| 168 | // max lookups | 187 | // max lookups |
| 169 | #define MAXRECURSION 5 | 188 | #define MAXRECURSION 5 |
| 170 | 189 | ||
| @@ -286,7 +305,11 @@ int depth; | |||
| 286 | unsigned int xlen,newlen; | 305 | unsigned int xlen,newlen; |
| 287 | char *x; | 306 | char *x; |
| 288 | for (i = 0;;++i) { | 307 | for (i = 0;;++i) { |
| 289 | if (i > localpart.len) return denyaddr(addr, depth); | 308 | if (i > localpart.len) { |
| 309 | x = virtualext(&localpart, at); | ||
| 310 | if (x) break; | ||
| 311 | return denyaddr(addr, depth); | ||
| 312 | } | ||
| 290 | if (!i || (i == at + 1) || (i == localpart.len) || | 313 | if (!i || (i == at + 1) || (i == localpart.len) || |
| 291 | ((i > at) && (localpart.s[i] == '.'))) { | 314 | ((i > at) && (localpart.s[i] == '.'))) { |
| 292 | x = constmap(&mapvdoms,localpart.s + i,localpart.len - i); | 315 | x = constmap(&mapvdoms,localpart.s + i,localpart.len - i); |
