From 100f692245931aee67d07905104188ef9465b334 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Fri, 27 Aug 2004 16:11:15 +0000 Subject: - Fix loopback problems with Postfix 1.x --- AUTHORS | 4 +++- ChangeLog | 5 ++++- common/smtppass.c | 36 +++++++++++++++++++++++++++++++----- configure.in | 4 ++-- src/clamsmtpd.c | 36 +++++++++++++++++++++++++++++++----- 5 files changed, 71 insertions(+), 14 deletions(-) diff --git a/AUTHORS b/AUTHORS index 82374c0..a80252d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,9 +1,11 @@ AUTHOR: Nate Nielsen +CONTRIBUTORS: +Andreas Steinmetz + PATCHES: Berk D. Demir João Carlos Mendes Luís Jasper Slits -Andreas Steinmetz Yamamoto Takao diff --git a/ChangeLog b/ChangeLog index 7c49094..ee9ecc3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ 0.7 - Added support for ESMTP [Andreas Steinmetz] - - Fixed other bugs + - Fixed crash when too many connections established + - Announce ourselves as 'clamsmtp' in EHLO/HELO responses which fixes 'loopback' + problems with certain versions of Postfix 1.x + - Fixed other minor bugs 0.6 - Proper adding of customized header [Berk D. Demir] diff --git a/common/smtppass.c b/common/smtppass.c index 984744d..a0e59cf 100644 --- a/common/smtppass.c +++ b/common/smtppass.c @@ -91,6 +91,7 @@ clamsmtp_thread_t; #define SMTP_DATA "DATA" CRLF #define SMTP_BANNER "220 clamsmtp" CRLF +#define SMTP_HELO_RSP "250 clamsmtp" CRLF #define SMTP_DELIMS "\r\n\t :-" #define ESMTP_PIPELINE "PIPELINING" @@ -674,11 +675,13 @@ static int smtp_passthru(clamsmtp_context_t* ctx) { char logline[LINE_LENGTH]; int r, ret = 0; - int first_rsp = 1; - int filter_ehlo = 0; fd_set mask; int neterror = 0; + int first_rsp = 1; /* The first 220 response from server to be filtered */ + int filter_ehlo = 0; /* Filtering parts of an EHLO extensions response */ + int filter_host = 0; /* Next response is 250 hostname, which we change */ + ASSERT(ctx->clam != -1 && ctx->server != -1); logline[0] = 0; @@ -720,9 +723,9 @@ static int smtp_passthru(clamsmtp_context_t* ctx) continue; } - /* Only valid after an EHLO command */ - if(filter_ehlo) - filter_ehlo = 0; + /* Only valid after EHLO or HELO commands */ + filter_ehlo = 0; + filter_host = 0; /* Handle the DATA section via our AV checker */ if(is_first_word(ctx->line, DATA_CMD, KL(DATA_CMD))) @@ -757,6 +760,7 @@ static int smtp_passthru(clamsmtp_context_t* ctx) { messagex(ctx, LOG_DEBUG, "filtering EHLO response"); filter_ehlo = 1; + filter_host = 1; /* A new message */ logline[0] = 0; @@ -768,6 +772,8 @@ static int smtp_passthru(clamsmtp_context_t* ctx) */ else if(is_first_word(ctx->line, HELO_CMD, KL(HELO_CMD))) { + filter_host = 1; + /* A new message line */ logline[0] = 0; } @@ -848,6 +854,26 @@ static int smtp_passthru(clamsmtp_context_t* ctx) } } + /* + * Certain mail servers (Postfix 1.x in particular) do a loop check + * on the 250 response after a EHLO or HELO. This is where we + * filter that to prevent loopback errors. + */ + if(filter_host) + { + filter_host = 0; + + if(check_first_word(ctx->line, OK_RSP, KL(OK_RSP), SMTP_DELIMS) > 0) + { + messagex(ctx, LOG_DEBUG, "intercepting host response"); + + if(write_data(ctx, &(ctx->client), SMTP_HELO_RSP) == -1) + RETURN(-1); + + continue; + } + } + /* * Filter out any EHLO responses that we can't or don't want * to support. For example pipelining or TLS. diff --git a/configure.in b/configure.in index f87c179..8087d2b 100644 --- a/configure.in +++ b/configure.in @@ -36,8 +36,8 @@ dnl Nate Nielsen dnl dnl Process this file with autoconf to produce a configure script. -AC_INIT(clamsmtp, 0.6.90, nielsen@memberwebs.com) -AM_INIT_AUTOMAKE(clamsmtp, 0.6.90) +AC_INIT(clamsmtp, 0.6.91, nielsen@memberwebs.com) +AM_INIT_AUTOMAKE(clamsmtp, 0.6.91) LDFLAGS="$LDFLAGS -L/usr/local/lib" CFLAGS="$CFLAGS -I/usr/local/include" diff --git a/src/clamsmtpd.c b/src/clamsmtpd.c index 984744d..a0e59cf 100644 --- a/src/clamsmtpd.c +++ b/src/clamsmtpd.c @@ -91,6 +91,7 @@ clamsmtp_thread_t; #define SMTP_DATA "DATA" CRLF #define SMTP_BANNER "220 clamsmtp" CRLF +#define SMTP_HELO_RSP "250 clamsmtp" CRLF #define SMTP_DELIMS "\r\n\t :-" #define ESMTP_PIPELINE "PIPELINING" @@ -674,11 +675,13 @@ static int smtp_passthru(clamsmtp_context_t* ctx) { char logline[LINE_LENGTH]; int r, ret = 0; - int first_rsp = 1; - int filter_ehlo = 0; fd_set mask; int neterror = 0; + int first_rsp = 1; /* The first 220 response from server to be filtered */ + int filter_ehlo = 0; /* Filtering parts of an EHLO extensions response */ + int filter_host = 0; /* Next response is 250 hostname, which we change */ + ASSERT(ctx->clam != -1 && ctx->server != -1); logline[0] = 0; @@ -720,9 +723,9 @@ static int smtp_passthru(clamsmtp_context_t* ctx) continue; } - /* Only valid after an EHLO command */ - if(filter_ehlo) - filter_ehlo = 0; + /* Only valid after EHLO or HELO commands */ + filter_ehlo = 0; + filter_host = 0; /* Handle the DATA section via our AV checker */ if(is_first_word(ctx->line, DATA_CMD, KL(DATA_CMD))) @@ -757,6 +760,7 @@ static int smtp_passthru(clamsmtp_context_t* ctx) { messagex(ctx, LOG_DEBUG, "filtering EHLO response"); filter_ehlo = 1; + filter_host = 1; /* A new message */ logline[0] = 0; @@ -768,6 +772,8 @@ static int smtp_passthru(clamsmtp_context_t* ctx) */ else if(is_first_word(ctx->line, HELO_CMD, KL(HELO_CMD))) { + filter_host = 1; + /* A new message line */ logline[0] = 0; } @@ -848,6 +854,26 @@ static int smtp_passthru(clamsmtp_context_t* ctx) } } + /* + * Certain mail servers (Postfix 1.x in particular) do a loop check + * on the 250 response after a EHLO or HELO. This is where we + * filter that to prevent loopback errors. + */ + if(filter_host) + { + filter_host = 0; + + if(check_first_word(ctx->line, OK_RSP, KL(OK_RSP), SMTP_DELIMS) > 0) + { + messagex(ctx, LOG_DEBUG, "intercepting host response"); + + if(write_data(ctx, &(ctx->client), SMTP_HELO_RSP) == -1) + RETURN(-1); + + continue; + } + } + /* * Filter out any EHLO responses that we can't or don't want * to support. For example pipelining or TLS. -- cgit v1.2.3