X-Git-Url: https://git.distorted.org.uk/~mdw/qmail/blobdiff_plain/dd1ee02180d4b2379a72ae2840c41bf204a4a244..6646fe4634ffb9aeae3b179c99cfb341416624e8:/addrcheck.c diff --git a/addrcheck.c b/addrcheck.c index b463bd8..63281a3 100644 --- a/addrcheck.c +++ b/addrcheck.c @@ -5,6 +5,7 @@ #include "addrcheck.h" #include #include +#include /* #define DEBUG */ #ifdef DEBUG @@ -131,9 +132,10 @@ static int localprobe(int cdb, const char *sender, if (pipe(p) || (kid = fork()) == -1) return (-1); if (!kid) { + close(0); open("/dev/null", O_RDONLY); dup2(p[1], 1); - close(p[0]); - close(p[1]); + close(2); open("/dev/null", O_WRONLY); + close(p[0]); close(p[1]); execl("/usr/bin/userv", "/usr/bin/userv", "-f", "stdin=/dev/null", u.s, serv.s, @@ -259,9 +261,10 @@ int addrcheck(int cdb, const char *addr, const char *sender, int *rc) int at, len, dot; int err = 0; uint32 dlen; + static stralloc l = STRALLOC_INIT; len = str_len(addr); - at = str_chr(addr, '@'); + at = str_rchr(addr, '@'); if (!addr[at]) return (local(cdb, addr, len, sender, rc)); @@ -278,8 +281,11 @@ int addrcheck(int cdb, const char *addr, const char *sender, int *rc) return (-1); if (!err) { *rc = 1; return (0); } if (dlen != 0) { errno = EINVAL; return (-1); } - - return (local(cdb, addr, at, sender, rc)); + l.len = 0; + if (!stralloc_catb(&l, addr, at) || + !stralloc_0(&l)) + return (-1); + return (local(cdb, l.s, l.len - 1, sender, rc)); } #ifdef TEST