From 0c573fd378f318457a9bb40f062c891edf684712 Mon Sep 17 00:00:00 2001 From: Jeremy Harris Date: Mon, 14 Jan 2013 20:29:54 +0000 Subject: [PATCH] PRDR server should shortcut full response processing for 1-recipient mails. --- src/src/receive.c | 7 ++++--- test/log/5500 | 3 +++ test/mail/5500.user1 | 8 ++++++++ test/scripts/5500-PRDR/5500 | 27 +++++++++++++++++++++++++++ test/stdout/5500 | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 test/mail/5500.user1 diff --git a/src/src/receive.c b/src/src/receive.c index 7145ec24a..e6ebda802 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -3228,7 +3228,7 @@ else #endif /* WITH_CONTENT_SCAN */ #ifdef EXPERIMENTAL_PRDR - if (prdr_requested && recipients_count > 0 && acl_smtp_data_prdr != NULL ) + if (prdr_requested && recipients_count > 1 && acl_smtp_data_prdr != NULL ) { unsigned int c; int all_pass = OK; @@ -3277,8 +3277,7 @@ else else if (user_msg) log_write(0, LOG_MAIN, "PRDR %s %s", addr, user_msg); else log_write(0, LOG_MAIN, msg); - if (rc != OK) - receive_remove_recipient(recipients_list[c--].address); + if (rc != OK) { receive_remove_recipient(addr); c--; } } /* Set up final message, used if data acl gives OK */ smtp_reply = string_sprintf("%s id=%s message %s", @@ -3290,6 +3289,8 @@ else ? US"accepted" : US"accepted for some recipients"); } + else + prdr_requested = FALSE; #endif /* EXPERIMENTAL_PRDR */ /* Check the recipients count again, as the MIME ACL might have changed diff --git a/test/log/5500 b/test/log/5500 index f96a1ccc4..e9e06a530 100644 --- a/test/log/5500 +++ b/test/log/5500 @@ -7,3 +7,6 @@ 1999-03-02 09:44:33 10HmaX-0005vi-00 PRDR R= acceptance 1999-03-02 09:44:33 10HmaX-0005vi-00 PRDR R= acceptance 1999-03-02 09:44:33 10HmaX-0005vi-00 H=(rhu.barb) [127.0.0.1] F=<> rejected after DATA +1999-03-02 09:44:33 10HmaZ-0005vi-00 <= <> H=(rhu.barb) [127.0.0.1] P=esmtp S=sss +1999-03-02 09:44:33 10HmaZ-0005vi-00 => user1 R=r0 T=t1 +1999-03-02 09:44:33 10HmaZ-0005vi-00 Completed diff --git a/test/mail/5500.user1 b/test/mail/5500.user1 new file mode 100644 index 000000000..a485c7c91 --- /dev/null +++ b/test/mail/5500.user1 @@ -0,0 +1,8 @@ +From MAILER-DAEMON Tue Mar 02 09:44:33 1999 +Received: from [127.0.0.1] (helo=rhu.barb) + by myhost.test.ex with esmtp (Exim x.yz) + id 10HmaZ-0005vi-00 + for user1@test.ex; Tue, 2 Mar 1999 09:44:33 +0000 +Sender: sender@some.where + + diff --git a/test/scripts/5500-PRDR/5500 b/test/scripts/5500-PRDR/5500 index 57d4290e1..3090fa5ed 100644 --- a/test/scripts/5500-PRDR/5500 +++ b/test/scripts/5500-PRDR/5500 @@ -66,5 +66,32 @@ quit ??? 221 **** sleep 1 +# +# +# 3: PRDR should be avoided for a single-recipient message +# even though the client showed support. +client 127.0.0.1 PORT_D +??? 220 +ehlo rhu.barb +??? 250- +??? 250- +??? 250- +??? 250- +??? 250-PRDR +??? 250 +mail from:<> PRDR +??? 250 +rcpt to: +??? 250 +data +??? 354 +Sender: sender@some.where +. +??? 250 +quit +??? 221 +**** +sleep 1 +# killdaemon # diff --git a/test/stdout/5500 b/test/stdout/5500 index debe3499b..7732787ef 100644 --- a/test/stdout/5500 +++ b/test/stdout/5500 @@ -87,3 +87,36 @@ Connecting to 127.0.0.1 port 1225 ... connected ??? 221 <<< 221 myhost.test.ex closing connection End of script +Connecting to 127.0.0.1 port 1225 ... connected +??? 220 +<<< 220 myhost.test.ex ESMTP Exim x.yz Tue, 2 Mar 1999 09:44:33 +0000 +>>> ehlo rhu.barb +??? 250- +<<< 250-myhost.test.ex Hello rhu.barb [127.0.0.1] +??? 250- +<<< 250-SIZE 52428800 +??? 250- +<<< 250-8BITMIME +??? 250- +<<< 250-PIPELINING +??? 250-PRDR +<<< 250-PRDR +??? 250 +<<< 250 HELP +>>> mail from:<> PRDR +??? 250 +<<< 250 OK, PRDR Requested +>>> rcpt to: +??? 250 +<<< 250 Accepted +>>> data +??? 354 +<<< 354 Enter message, ending with "." on a line by itself +>>> Sender: sender@some.where +>>> . +??? 250 +<<< 250 OK id=10HmaZ-0005vi-00 +>>> quit +??? 221 +<<< 221 myhost.test.ex closing connection +End of script -- 2.25.1