From 5c962b270c5f8459cdd99366bf2753f80ed5b107 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sun, 16 Sep 2018 21:20:44 +0100 Subject: [PATCH] Fix filter noerror command. Bug 2318 (cherry picked from commit 25beaee4c28ed29a37078e6c68fa3d18ced6ec8c) --- doc/doc-txt/ChangeLog | 4 ++++ src/src/rda.c | 12 ++++++++--- test/aux-fixed/0616.filter | 3 +++ test/aux-fixed/0617.filter | 3 +++ test/confs/0616 | 40 ++++++++++++++++++++++++++++++++++++ test/confs/0617 | 40 ++++++++++++++++++++++++++++++++++++ test/log/0616 | 7 +++++++ test/log/0617 | 9 ++++++++ test/scripts/0000-Basic/0616 | 25 ++++++++++++++++++++++ test/scripts/0000-Basic/0617 | 25 ++++++++++++++++++++++ test/stdout/0616 | 30 +++++++++++++++++++++++++++ test/stdout/0617 | 30 +++++++++++++++++++++++++++ 12 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 test/aux-fixed/0616.filter create mode 100644 test/aux-fixed/0617.filter create mode 100644 test/confs/0616 create mode 100644 test/confs/0617 create mode 100644 test/log/0616 create mode 100644 test/log/0617 create mode 100644 test/scripts/0000-Basic/0616 create mode 100644 test/scripts/0000-Basic/0617 create mode 100644 test/stdout/0616 create mode 100644 test/stdout/0617 diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 3bd8c0a0d..ad9a23f52 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -50,6 +50,10 @@ JH/20 Bug 2296: Fix cutthrough for >1 address redirection. Previously only time. Either a crash (after delivery) or bogus log data could result. Discovery and analysis by Tim Stewart. +JH/23 Bug 2318: Fix the noerror command within filters. It wasn't working. + The ignore_error flag wasn't being returned from the filter subprocess so + was not set for later routers. Investigation and fix by Matthias Kurz. + Exim version 4.91 ----------------- diff --git a/src/src/rda.c b/src/src/rda.c index 2d8bda8b1..b3d23104e 100644 --- a/src/src/rda.c +++ b/src/src/rda.c @@ -718,11 +718,13 @@ if ((pid = fork()) == 0) for (addr = *generated; addr; addr = addr->next) { int reply_options = 0; + int ig_err = addr->prop.ignore_error ? 1 : 0; if ( rda_write_string(fd, addr->address) != 0 || write(fd, &addr->mode, sizeof(addr->mode)) != sizeof(addr->mode) || write(fd, &addr->flags, sizeof(addr->flags)) != sizeof(addr->flags) || rda_write_string(fd, addr->prop.errors_address) != 0 + || write(fd, &ig_err, sizeof(ig_err)) != sizeof(ig_err) ) goto bad; @@ -887,9 +889,13 @@ if (yield == FF_DELIVERED || yield == FF_NOTDELIVERED || /* Next comes the mode and the flags fields */ - if (read(fd, &addr->mode, sizeof(addr->mode)) != sizeof(addr->mode) || - read(fd, &addr->flags, sizeof(addr->flags)) != sizeof(addr->flags) || - !rda_read_string(fd, &addr->prop.errors_address)) goto DISASTER; + if ( read(fd, &addr->mode, sizeof(addr->mode)) != sizeof(addr->mode) + || read(fd, &addr->flags, sizeof(addr->flags)) != sizeof(addr->flags) + || !rda_read_string(fd, &addr->prop.errors_address) + || read(fd, &i, sizeof(i)) != sizeof(i) + ) + goto DISASTER; + addr->prop.ignore_error = (i != 0); /* Next comes a possible setting for $thisaddress and any numerical variables for pipe expansion, terminated by a NULL string. The maximum diff --git a/test/aux-fixed/0616.filter b/test/aux-fixed/0616.filter new file mode 100644 index 000000000..283d823da --- /dev/null +++ b/test/aux-fixed/0616.filter @@ -0,0 +1,3 @@ +# Exim filter + +unseen noerror deliver usery@domain1 diff --git a/test/aux-fixed/0617.filter b/test/aux-fixed/0617.filter new file mode 100644 index 000000000..394d1b2df --- /dev/null +++ b/test/aux-fixed/0617.filter @@ -0,0 +1,3 @@ +# Exim filter + +unseen deliver usery@domain1 diff --git a/test/confs/0616 b/test/confs/0616 new file mode 100644 index 000000000..e710a4bc5 --- /dev/null +++ b/test/confs/0616 @@ -0,0 +1,40 @@ +# Exim test configuration 0616 + +.include DIR/aux-var/std_conf_prefix + +# ----- Routers ----- + +begin routers + +route_userx: + driver = redirect + local_parts = userx + errors_to = dump@domain1 + allow_filter + file = DIR/aux-fixed/TESTNUM.filter + user = EXIMUSER + no_more + +dump_bounces: + driver = redirect + local_parts = dump + data = :blackhole: + no_more + +route_smtp: + driver = manualroute + route_list = * 127.0.0.1 byname + errors_to = dump@domain1 + self = send + transport = smtp + no_more + +# ----- Transports ----- + +begin transports + +smtp: + driver = smtp + port = PORT_S + +# End diff --git a/test/confs/0617 b/test/confs/0617 new file mode 100644 index 000000000..cf5251774 --- /dev/null +++ b/test/confs/0617 @@ -0,0 +1,40 @@ +# Exim test configuration 0617 + +.include DIR/aux-var/std_conf_prefix + +# ----- Routers ----- + +begin routers + +route_userx: + driver = redirect + local_parts = userx + errors_to = dump@domain1 + allow_filter + file = DIR/aux-fixed/TESTNUM.filter + user = EXIMUSER + no_more + +dump_bounces: + driver = redirect + local_parts = dump + data = :blackhole: + no_more + +route_smtp: + driver = manualroute + route_list = * 127.0.0.1 byname + errors_to = dump@domain1 + self = send + transport = smtp + no_more + +# ----- Transports ----- + +begin transports + +smtp: + driver = smtp + port = PORT_S + +# End diff --git a/test/log/0616 b/test/log/0616 new file mode 100644 index 000000000..e64ccde6e --- /dev/null +++ b/test/log/0616 @@ -0,0 +1,7 @@ +1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss +1999-03-02 09:44:33 Start queue run: pid=pppp -qqf +1999-03-02 09:44:33 10HmaX-0005vi-00 => userx@domain1 R=route_smtp T=smtp H=127.0.0.1 [127.0.0.1] C="250 OK" +1999-03-02 09:44:33 10HmaX-0005vi-00 ** usery@domain1 R=route_smtp T=smtp H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:: 550 Not that one +1999-03-02 09:44:33 10HmaX-0005vi-00 usery@domain1 : error ignored +1999-03-02 09:44:33 10HmaX-0005vi-00 Completed +1999-03-02 09:44:33 End queue run: pid=pppp -qqf diff --git a/test/log/0617 b/test/log/0617 new file mode 100644 index 000000000..865db794e --- /dev/null +++ b/test/log/0617 @@ -0,0 +1,9 @@ +1999-03-02 09:44:33 10HmaX-0005vi-00 <= CALLER@the.local.host.name U=CALLER P=local S=sss +1999-03-02 09:44:33 Start queue run: pid=pppp -qqf +1999-03-02 09:44:33 10HmaX-0005vi-00 => userx@domain1 R=route_smtp T=smtp H=127.0.0.1 [127.0.0.1] C="250 OK" +1999-03-02 09:44:33 10HmaX-0005vi-00 ** usery@domain1 R=route_smtp T=smtp H=127.0.0.1 [127.0.0.1]: SMTP error from remote mail server after RCPT TO:: 550 Not that one +1999-03-02 09:44:33 10HmaY-0005vi-00 <= <> R=10HmaX-0005vi-00 U=EXIMUSER P=local S=sss +1999-03-02 09:44:33 10HmaY-0005vi-00 => :blackhole: R=dump_bounces +1999-03-02 09:44:33 10HmaY-0005vi-00 Completed +1999-03-02 09:44:33 10HmaX-0005vi-00 Completed +1999-03-02 09:44:33 End queue run: pid=pppp -qqf diff --git a/test/scripts/0000-Basic/0616 b/test/scripts/0000-Basic/0616 new file mode 100644 index 000000000..4ac173db3 --- /dev/null +++ b/test/scripts/0000-Basic/0616 @@ -0,0 +1,25 @@ +# Filter file which makes use of "unseen noerror deliver" commands +# +exim -odq userx@domain1 +This message will also be delivered to usery +**** +server PORT_S +220 ESMTP +EHLO +250-OK +250 HELP +MAIL +250 OK +RCPT +250 OK +RCPT +550 Not that one +DATA +354 More... +. +250 OK +QUIT +220 OK +**** +exim -qqf +**** diff --git a/test/scripts/0000-Basic/0617 b/test/scripts/0000-Basic/0617 new file mode 100644 index 000000000..352c75731 --- /dev/null +++ b/test/scripts/0000-Basic/0617 @@ -0,0 +1,25 @@ +# Filter file which makes use of "unseen deliver" commands +# +exim -odq userx@domain1 +This message will also be delivered to usery +**** +server PORT_S +220 ESMTP +EHLO +250-OK +250 HELP +MAIL +250 OK +RCPT +250 OK +RCPT +550 Not that one +DATA +354 More... +. +250 OK +QUIT +220 OK +**** +exim -qqf +**** diff --git a/test/stdout/0616 b/test/stdout/0616 new file mode 100644 index 000000000..369cf7f39 --- /dev/null +++ b/test/stdout/0616 @@ -0,0 +1,30 @@ + +******** SERVER ******** +Listening on port 1224 ... +Connection request from [127.0.0.1] +220 ESMTP +EHLO the.local.host.name +250-OK +250 HELP +MAIL FROM: +250 OK +RCPT TO: +250 OK +RCPT TO: +550 Not that one +DATA +354 More... +Received: from CALLER by the.local.host.name with local (Exim x.yz) + (envelope-from ) + id 10HmaX-0005vi-00 + for userx@domain1; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: +From: CALLER_NAME +Date: Tue, 2 Mar 1999 09:44:33 +0000 + +This message will also be delivered to usery +. +250 OK +QUIT +220 OK +End of script diff --git a/test/stdout/0617 b/test/stdout/0617 new file mode 100644 index 000000000..369cf7f39 --- /dev/null +++ b/test/stdout/0617 @@ -0,0 +1,30 @@ + +******** SERVER ******** +Listening on port 1224 ... +Connection request from [127.0.0.1] +220 ESMTP +EHLO the.local.host.name +250-OK +250 HELP +MAIL FROM: +250 OK +RCPT TO: +250 OK +RCPT TO: +550 Not that one +DATA +354 More... +Received: from CALLER by the.local.host.name with local (Exim x.yz) + (envelope-from ) + id 10HmaX-0005vi-00 + for userx@domain1; Tue, 2 Mar 1999 09:44:33 +0000 +Message-Id: +From: CALLER_NAME +Date: Tue, 2 Mar 1999 09:44:33 +0000 + +This message will also be delivered to usery +. +250 OK +QUIT +220 OK +End of script -- 2.30.2