summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qmail-send.c19
-rw-r--r--realrcptto.c25
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
168static 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);