4da658781a5105d220565d88186a47e884545271
[exim.git] / src / src / routers / redirect.c
1 /*************************************************
2 *     Exim - an Internet mail transport agent    *
3 *************************************************/
4
5 /* Copyright (c) The Exim Maintainers 2020 - 2024 */
6 /* Copyright (c) University of Cambridge 1995 - 2018 */
7 /* See the file NOTICE for conditions of use and distribution. */
8 /* SPDX-License-Identifier: GPL-2.0-or-later */
9
10
11 #include "../exim.h"
12
13 #ifdef ROUTER_REDIRECT  /* Remainder of file */
14 #include "rf_functions.h"
15 #include "redirect.h"
16
17
18
19 /* Options specific to the redirect router. */
20 #define LOFF(field) OPT_OFF(redirect_router_options_block, field)
21
22 optionlist redirect_router_options[] = {
23   { "allow_defer",        opt_bit | (RDON_DEFER << 16),
24       LOFF(bit_options) },
25   { "allow_fail",         opt_bit | (RDON_FAIL << 16),
26       LOFF(bit_options) },
27   { "allow_filter",       opt_bit | (RDON_FILTER << 16),
28       LOFF(bit_options) },
29   { "allow_freeze",       opt_bit | (RDON_FREEZE << 16),
30       LOFF(bit_options) },
31   { "check_ancestor",     opt_bool,             LOFF(check_ancestor) },
32   { "check_group",        opt_bool,             LOFF(check_group) },
33   { "check_owner",        opt_bool,             LOFF(check_owner) },
34   { "data",               opt_stringptr,        LOFF(data) },
35   { "directory_transport",opt_stringptr,        LOFF(directory_transport_name) },
36   { "file",               opt_stringptr,        LOFF(file) },
37   { "file_transport",     opt_stringptr,        LOFF(file_transport_name) },
38
39   { "filter_prepend_home",opt_bit | (RDON_PREPEND_HOME << 16),
40       LOFF(bit_options) },
41   { "forbid_blackhole",   opt_bit | (RDON_BLACKHOLE << 16),
42       LOFF(bit_options) },
43   { "forbid_exim_filter", opt_bit | (RDON_EXIM_FILTER << 16),
44       LOFF(bit_options) },
45   { "forbid_file",        opt_bool,
46       LOFF(forbid_file) },
47   { "forbid_filter_dlfunc", opt_bit | (RDON_DLFUNC << 16),
48       LOFF(bit_options) },
49   { "forbid_filter_existstest",  opt_bit | (RDON_EXISTS << 16),
50       LOFF(bit_options) },
51   { "forbid_filter_logwrite",opt_bit | (RDON_LOG << 16),
52       LOFF(bit_options) },
53   { "forbid_filter_lookup", opt_bit | (RDON_LOOKUP << 16),
54       LOFF(bit_options) },
55   { "forbid_filter_perl", opt_bit | (RDON_PERL << 16),
56       LOFF(bit_options) },
57   { "forbid_filter_readfile", opt_bit | (RDON_READFILE << 16),
58       LOFF(bit_options) },
59   { "forbid_filter_readsocket", opt_bit | (RDON_READSOCK << 16),
60       LOFF(bit_options) },
61   { "forbid_filter_reply",opt_bool,
62       LOFF(forbid_filter_reply) },
63   { "forbid_filter_run",  opt_bit | (RDON_RUN << 16),
64       LOFF(bit_options) },
65   { "forbid_include",     opt_bit | (RDON_INCLUDE << 16),
66       LOFF(bit_options) },
67   { "forbid_pipe",        opt_bool,
68       LOFF(forbid_pipe) },
69   { "forbid_sieve_filter",opt_bit | (RDON_SIEVE_FILTER << 16),
70       LOFF(bit_options) },
71   { "forbid_smtp_code",     opt_bool,
72       LOFF(forbid_smtp_code) },
73   { "hide_child_in_errmsg", opt_bool,
74       LOFF( hide_child_in_errmsg) },
75   { "ignore_eacces",      opt_bit | (RDON_EACCES << 16),
76       LOFF(bit_options) },
77   { "ignore_enotdir",     opt_bit | (RDON_ENOTDIR << 16),
78       LOFF(bit_options) },
79
80   { "include_directory",  opt_stringptr,        LOFF( include_directory) },
81   { "modemask",           opt_octint,           LOFF(modemask) },
82   { "one_time",           opt_bool,             LOFF(one_time) },
83   { "owners",             opt_uidlist,          LOFF(owners) },
84   { "owngroups",          opt_gidlist,          LOFF(owngroups) },
85   { "pipe_transport",     opt_stringptr,        LOFF(pipe_transport_name) },
86   { "qualify_domain",     opt_stringptr,        LOFF(qualify_domain) },
87   { "qualify_preserve_domain", opt_bool,        LOFF(qualify_preserve_domain) },
88   { "repeat_use",         opt_bool | opt_public, OPT_OFF(router_instance, repeat_use) },
89   { "reply_transport",    opt_stringptr,        LOFF(reply_transport_name) },
90
91   { "rewrite",            opt_bit | (RDON_REWRITE << 16),
92       LOFF(bit_options) },
93
94   { "sieve_enotify_mailto_owner", opt_stringptr, LOFF(sieve_enotify_mailto_owner) },
95   { "sieve_inbox",        opt_stringptr,        LOFF(sieve_inbox) },
96   { "sieve_subaddress",   opt_stringptr,        LOFF(sieve_subaddress) },
97   { "sieve_useraddress",  opt_stringptr,        LOFF(sieve_useraddress) },
98   { "sieve_vacation_directory", opt_stringptr,  LOFF(sieve_vacation_directory) },
99   { "skip_syntax_errors", opt_bool,             LOFF(skip_syntax_errors) },
100   { "syntax_errors_text", opt_stringptr,        LOFF(syntax_errors_text) },
101   { "syntax_errors_to",   opt_stringptr,        LOFF(syntax_errors_to) }
102 };
103
104 /* Size of the options list. An extern variable has to be used so that its
105 address can appear in the tables drtables.c. */
106
107 int redirect_router_options_count =
108   sizeof(redirect_router_options)/sizeof(optionlist);
109
110
111 #ifdef MACRO_PREDEF
112
113 /* Dummy entries */
114 redirect_router_options_block redirect_router_option_defaults = {0};
115 void redirect_router_init(router_instance *rblock) {}
116 int redirect_router_entry(router_instance *rblock, address_item *addr,
117   struct passwd *pw, int verify, address_item **addr_local,
118   address_item **addr_remote, address_item **addr_new,
119   address_item **addr_succeed) {return 0;}
120
121 #else   /*!MACRO_PREDEF*/
122
123
124
125 /* Default private options block for the redirect router.
126 Unlisted elements are 0/NULL/FALSE */
127
128 redirect_router_options_block redirect_router_option_defaults = {
129   .modemask = 022,
130   .bit_options = RDO_REWRITE | RDO_PREPEND_HOME,
131   .check_owner = TRUE_UNSET,
132   .check_group = TRUE_UNSET,
133 };
134
135
136
137 /*************************************************
138 *          Initialization entry point            *
139 *************************************************/
140
141 /* Called for each instance, after its options have been read, to enable
142 consistency checks to be done, or anything else that needs to be set up. */
143
144 void redirect_router_init(router_instance *rblock)
145 {
146 redirect_router_options_block *ob =
147   (redirect_router_options_block *)(rblock->options_block);
148
149 /* Either file or data must be set, but not both */
150
151 if ((ob->file == NULL) == (ob->data == NULL))
152   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n  "
153     "%sone of \"file\" or \"data\" must be specified",
154     rblock->name, (ob->file == NULL)? "" : "only ");
155
156 /* Onetime aliases can only be real addresses. Headers can't be manipulated.
157 The combination of one_time and unseen is not allowed. We can't check the
158 expansion of "unseen" here, but we assume that if it is set to anything other
159 than false, there is likely to be a problem. */
160
161 if (ob->one_time)
162   {
163   ob->forbid_pipe = ob->forbid_file = ob->forbid_filter_reply = TRUE;
164   if (rblock->extra_headers || rblock->remove_headers)
165     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n  "
166       "\"headers_add\" and \"headers_remove\" are not permitted with "
167       "\"one_time\"", rblock->name);
168   if (rblock->unseen || rblock->expand_unseen)
169     log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n  "
170       "\"unseen\" may not be used with \"one_time\"", rblock->name);
171   }
172
173 /* The defaults for check_owner and check_group depend on other settings. The
174 defaults are: Check the owner if check_local_user or owners is set; check the
175 group if check_local_user is set without a restriction on the group write bit,
176 or if owngroups is set. */
177
178 if (ob->check_owner == TRUE_UNSET)
179   ob->check_owner = rblock->check_local_user ||
180                     (ob->owners && ob->owners[0] != 0);
181
182 if (ob->check_group == TRUE_UNSET)
183   ob->check_group = (rblock->check_local_user && (ob->modemask & 020) == 0) ||
184                     (ob->owngroups != NULL && ob->owngroups[0] != 0);
185
186 /* If explicit qualify domain set, the preserve option is locked out */
187
188 if (ob->qualify_domain && ob->qualify_preserve_domain)
189   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n  "
190     "only one of \"qualify_domain\" or \"qualify_preserve_domain\" must be set",
191     rblock->name);
192
193 /* If allow_filter is set, either user or check_local_user must be set. */
194
195 if (!rblock->check_local_user &&
196     !rblock->uid_set &&
197     rblock->expand_uid == NULL &&
198     (ob->bit_options & RDO_FILTER) != 0)
199   log_write(0, LOG_PANIC_DIE|LOG_CONFIG_FOR, "%s router:\n  "
200     "\"user\" or \"check_local_user\" must be set with \"allow_filter\"",
201     rblock->name);
202 }
203
204
205
206 /*************************************************
207 *       Get errors address and header mods       *
208 *************************************************/
209
210 /* This function is called when new addresses are generated, in order to
211 sort out errors address and header modifications. We put the errors address
212 into the parent address (even though it is never used from there because that
213 address is never transported) so that it can be retrieved if any of the
214 children gets routed by an "unseen" router. The clone of the child that is
215 passed on must have the original errors_address value.
216
217 Arguments:
218   rblock               the router control block
219   addr                 the address being routed
220   verify               v_none/v_recipient/v_sender/v_expn
221   addr_prop            point to the propagated block, which is where the
222                          new values are to be placed
223
224 Returns:    the result of rf_get_errors_address() or rf_get_munge_headers(),
225             which is either OK or DEFER
226 */
227
228 static int
229 sort_errors_and_headers(router_instance *rblock, address_item *addr,
230   int verify, address_item_propagated *addr_prop)
231 {
232 int frc = rf_get_errors_address(addr, rblock, verify,
233   &addr_prop->errors_address);
234 if (frc != OK) return frc;
235 addr->prop.errors_address = addr_prop->errors_address;
236 return rf_get_munge_headers(addr, rblock, &addr_prop->extra_headers,
237   &addr_prop->remove_headers);
238 }
239
240
241
242 /*************************************************
243 *    Process a set of generated new addresses    *
244 *************************************************/
245
246 /* This function sets up a set of newly generated child addresses and puts them
247 on the new address chain. Copy in the uid, gid and permission flags for use by
248 pipes and files, set the parent, and "or" its af_ignore_error flag. Also record
249 the setting for any starting router.
250
251 If the generated address is the same as one of its ancestors, and the
252 check_ancestor flag is set, do not use this generated address, but replace it
253 with a copy of the input address. This is to cope with cases where A is aliased
254 to B and B has a .forward file pointing to A, though it is usually set on the
255 forwardfile rather than the aliasfile. We can't just pass on the old
256 address by returning FAIL, because it must act as a general parent for
257 generated addresses, and only get marked "done" when all its children are
258 delivered.
259
260 Arguments:
261   rblock                  router block
262   addr_new                new address chain
263   addr                    original address
264   generated               list of generated addresses
265   addr_prop               the propagated block, containing the errors_address,
266                             header modification stuff, and address_data
267   ugidptr                 points to uid/gid data for files, pipes, autoreplies
268   pw                      password entry, set if ob->check_local_user is TRUE
269
270 Returns:         nothing
271 */
272
273 static void
274 add_generated(router_instance *rblock, address_item **addr_new,
275   address_item *addr, address_item *generated,
276   address_item_propagated *addr_prop, ugid_block *ugidptr, struct passwd *pw)
277 {
278 redirect_router_options_block *ob =
279   (redirect_router_options_block *)(rblock->options_block);
280
281 while (generated)
282   {
283   address_item * next = generated, * parent;
284   const uschar * errors_address = next->prop.errors_address;
285
286   generated = next->next;
287   next->parent = addr;
288   next->start_router = rblock->redirect_router;
289   if (addr->child_count == USHRT_MAX)
290     log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s router generated more than %d "
291       "child addresses for <%s>", rblock->name, USHRT_MAX, addr->address);
292   addr->child_count++;
293
294   next->next = *addr_new;
295   *addr_new = next;
296
297   /* Don't do the "one_time" thing for the first pass of a 2-stage queue run. */
298
299   if (ob->one_time && !f.queue_2stage)
300     {
301     for (parent = addr; parent->parent; parent = parent->parent) ;
302     next->onetime_parent = parent->address;
303     }
304
305   if (ob->hide_child_in_errmsg) setflag(next, af_hide_child);
306
307   /* If check_ancestor is set, we want to know if any ancestor of this address
308   is the address we are about to generate. The check must be done caselessly
309   unless the ancestor was routed by a case-sensitive router. */
310
311   if (ob->check_ancestor)
312     for (parent = addr; parent; parent = parent->parent)
313       if ((parent->router && parent->router->caseful_local_part
314            ? Ustrcmp(next->address, parent->address)
315            : strcmpic(next->address, parent->address)
316           ) == 0)
317         {
318         DEBUG(D_route) debug_printf("generated parent replaced by child\n");
319         next->address = string_copy(addr->address);
320         break;
321         }
322
323   /* A user filter may, under some circumstances, set up an errors address.
324   If so, we must take care to re-instate it when we copy in the propagated
325   data so that it overrides any errors_to setting on the router. */
326
327     {
328     BOOL ignore_error = next->prop.ignore_error;
329     next->prop = *addr_prop;
330     next->prop.ignore_error = ignore_error || addr->prop.ignore_error;
331     }
332   if (errors_address) next->prop.errors_address = errors_address;
333
334   /* For pipes, files, and autoreplies, record this router as handling them,
335   because they don't go through the routing process again. Then set up uid,
336   gid, home and current directories for transporting. */
337
338   if (testflag(next, af_pfr))
339     {
340     next->router = rblock;
341     rf_set_ugid(next, ugidptr);   /* Will contain pw values if not overridden */
342
343     /* When getting the home directory out of the password information, wrap it
344     in \N...\N to avoid expansion later. In Cygwin, home directories can
345     contain $ characters. */
346
347     if (rblock->home_directory)
348       next->home_dir = rblock->home_directory;
349     else if (rblock->check_local_user)
350       next->home_dir = string_sprintf("\\N%s\\N", pw->pw_dir);
351     else if (rblock->router_home_directory && testflag(addr, af_home_expanded))
352       {
353       next->home_dir = deliver_home;
354       setflag(next, af_home_expanded);
355       }
356
357     next->current_dir = rblock->current_directory;
358
359     /* Permission options */
360
361     if (!ob->forbid_pipe) setflag(next, af_allow_pipe);
362     if (!ob->forbid_file) setflag(next, af_allow_file);
363     if (!ob->forbid_filter_reply) setflag(next, af_allow_reply);
364
365     /* If the transport setting fails, the error gets picked up at the outer
366     level from the setting of basic_errno in the address. */
367
368     if (next->address[0] == '|')
369       {
370       address_pipe = next->address;
371       GET_OPTION("pipe_transport");
372       if (rf_get_transport(ob->pipe_transport_name, &ob->pipe_transport,
373           next, rblock->name, US"pipe_transport"))
374         next->transport = ob->pipe_transport;
375       address_pipe = NULL;
376       }
377     else if (next->address[0] == '>')
378       {
379       GET_OPTION("reply_transport");
380       if (rf_get_transport(ob->reply_transport_name, &ob->reply_transport,
381           next, rblock->name, US"reply_transport"))
382         next->transport = ob->reply_transport;
383       }
384     else  /* must be file or directory */
385       {
386       int len = Ustrlen(next->address);
387       address_file = next->address;
388       if (next->address[len-1] == '/')
389         {
390         GET_OPTION("directory_transport");
391         if (rf_get_transport(ob->directory_transport_name,
392             &(ob->directory_transport), next, rblock->name,
393             US"directory_transport"))
394           next->transport = ob->directory_transport;
395         }
396       else
397         {
398         GET_OPTION("file_transport");
399         if (rf_get_transport(ob->file_transport_name, &ob->file_transport,
400             next, rblock->name, US"file_transport"))
401           next->transport = ob->file_transport;
402         }
403
404       address_file = NULL;
405       }
406     }
407
408 #ifdef SUPPORT_I18N
409     if (!next->prop.utf8_msg)
410       next->prop.utf8_msg = string_is_utf8(next->address)
411         || (sender_address && string_is_utf8(sender_address));
412 #endif
413
414   DEBUG(D_route)
415     {
416     debug_printf("%s router generated %s\n  %serrors_to=%s transport=%s\n",
417       rblock->name,
418       next->address,
419       testflag(next, af_pfr)? "pipe, file, or autoreply\n  " : "",
420       next->prop.errors_address,
421       (next->transport == NULL)? US"NULL" : next->transport->name);
422
423     if (testflag(next, af_uid_set))
424       debug_printf("  uid=%ld ", (long int)(next->uid));
425     else
426       debug_printf("  uid=unset ");
427
428     if (testflag(next, af_gid_set))
429       debug_printf("gid=%ld ", (long int)(next->gid));
430     else
431       debug_printf("gid=unset ");
432
433 #ifdef SUPPORT_I18N
434     if (next->prop.utf8_msg) debug_printf("utf8 ");
435 #endif
436
437     debug_printf("home=%s\n", next->home_dir);
438     }
439   }
440 }
441
442
443 /*************************************************
444 *              Main entry point                  *
445 *************************************************/
446
447 /* See local README for interface description. This router returns:
448
449 DECLINE
450   . empty address list, or filter did nothing significant
451
452 DEFER
453   . verifying the errors address caused a deferment or a big disaster such
454       as an expansion failure (rf_get_errors_address)
455   . expanding a headers_{add,remove} string caused a deferment or another
456       expansion error (rf_get_munge_headers)
457   . :defer: or "freeze" in a filter
458   . error in address list or filter
459   . skipped syntax errors, but failed to send the message
460
461 DISCARD
462   . address was :blackhole:d or "seen finish"ed
463
464 FAIL
465   . :fail:
466
467 OK
468   . new addresses added to addr_new
469 */
470
471 int redirect_router_entry(
472   router_instance *rblock,        /* data for this instantiation */
473   address_item *addr,             /* address we are working on */
474   struct passwd *pw,              /* passwd entry after check_local_user */
475   int verify,                     /* v_none/v_recipient/v_sender/v_expn */
476   address_item **addr_local,      /* add it to this if it's local */
477   address_item **addr_remote,     /* add it to this if it's remote */
478   address_item **addr_new,        /* put new addresses on here */
479   address_item **addr_succeed)    /* put old address here on success */
480 {
481 redirect_router_options_block *ob =
482   (redirect_router_options_block *)(rblock->options_block);
483 address_item *generated = NULL;
484 const uschar *save_qualify_domain_recipient = qualify_domain_recipient;
485 uschar *discarded = US"discarded";
486 address_item_propagated addr_prop;
487 error_block *eblock = NULL;
488 ugid_block ugid;
489 redirect_block redirect;
490 sieve_block sieve;
491 int filtertype = FILTER_UNSET;
492 int yield = OK;
493 int options = ob->bit_options;
494 int frc = 0;
495 int xrc = 0;
496
497 /* Initialize the data to be propagated to the children */
498
499 addr_prop.address_data = deliver_address_data;
500 addr_prop.domain_data = deliver_domain_data;
501 addr_prop.localpart_data = deliver_localpart_data;
502 addr_prop.errors_address = NULL;
503 addr_prop.extra_headers = NULL;
504 addr_prop.remove_headers = NULL;
505 addr_prop.variables = NULL;
506 tree_dup((tree_node **)&addr_prop.variables, addr->prop.variables);
507
508 #ifdef SUPPORT_I18N
509 addr_prop.utf8_msg = addr->prop.utf8_msg;
510 addr_prop.utf8_downcvt = addr->prop.utf8_downcvt;
511 addr_prop.utf8_downcvt_maybe = addr->prop.utf8_downcvt_maybe;
512 #endif
513
514
515 /* When verifying and testing addresses, the "logwrite" command in filters
516 must be bypassed. */
517
518 if (verify == v_none && !f.address_test_mode) options |= RDO_REALLOG;
519
520 /* Sort out the fixed or dynamic uid/gid. This uid is used (a) for reading the
521 file (and interpreting a filter) and (b) for running the transports for
522 generated file and pipe addresses. It is not (necessarily) the same as the uids
523 that may own the file. Exim panics if an expanded string is not a number and
524 can't be found in the password file. Other errors set the freezing bit. */
525
526 if (!rf_get_ugid(rblock, addr, &ugid)) return DEFER;
527
528 if (!ugid.uid_set && pw != NULL)
529   {
530   ugid.uid = pw->pw_uid;
531   ugid.uid_set = TRUE;
532   }
533
534 if (!ugid.gid_set && pw != NULL)
535   {
536   ugid.gid = pw->pw_gid;
537   ugid.gid_set = TRUE;
538   }
539
540 /* Call the function that interprets redirection data, either inline or from a
541 file. This is a separate function so that the system filter can use it. It will
542 run the function in a subprocess if necessary. If qualify_preserve_domain is
543 set, temporarily reset qualify_domain_recipient to the current domain so that
544 any unqualified addresses get qualified with the same domain as the incoming
545 address. Otherwise, if a local qualify_domain is provided, set that up. */
546
547 if (ob->qualify_preserve_domain)
548   qualify_domain_recipient = addr->domain;
549 else
550   {
551   GET_OPTION("qualify_domain");
552   if (ob->qualify_domain)
553     {
554     uschar *new_qdr = rf_expand_data(addr, ob->qualify_domain, &xrc);
555     if (!new_qdr) return xrc;
556     qualify_domain_recipient = new_qdr;
557     }
558   }
559
560 redirect.owners = ob->owners;
561 redirect.owngroups = ob->owngroups;
562 redirect.modemask = ob->modemask;
563 redirect.check_owner = ob->check_owner;
564 redirect.check_group = ob->check_group;
565 redirect.pw = pw;
566
567 redirect.string = (redirect.isfile = (ob->file != NULL))
568   ? ob->file : ob->data;
569
570 sieve.inbox = ob->sieve_inbox;
571 sieve.subaddress = ob->sieve_subaddress;
572 sieve.vacation_dir = ob->sieve_vacation_directory;
573 sieve.useraddress = ob->sieve_useraddress;
574 sieve.enotify_mailto_owner = ob->sieve_enotify_mailto_owner;
575
576 frc = rda_interpret(&redirect, options, ob->include_directory, &sieve, &ugid,
577   &generated, &addr->message, ob->skip_syntax_errors ? &eblock : NULL,
578   &filtertype, string_sprintf("%s router (recipient is %s)", rblock->name,
579   addr->address));
580
581 qualify_domain_recipient = save_qualify_domain_recipient;
582
583 /* Handle exceptional returns from filtering or processing an address list.
584 For FAIL and FREEZE we honour any previously set up deliveries by a filter. */
585
586 switch (frc)
587   {
588   case FF_NONEXIST:
589     addr->message = addr->user_message = NULL;
590     return DECLINE;
591
592   case FF_BLACKHOLE:
593     DEBUG(D_route) debug_printf("address :blackhole:d\n");
594     generated = NULL;
595     discarded = US":blackhole:";
596     frc = FF_DELIVERED;
597     break;
598
599     /* FF_DEFER and FF_FAIL can arise only as a result of explicit commands
600     (:defer: or :fail: in an alias file or "fail" in a filter). If a configured
601     message was supplied, allow it to be included in an SMTP response after
602     verifying. Remove any SMTP code if it is not allowed. */
603
604   case FF_DEFER:
605     yield = DEFER;
606     goto SORT_MESSAGE;
607
608   case FF_FAIL:
609     if ((xrc = sort_errors_and_headers(rblock, addr, verify, &addr_prop)) != OK)
610       return xrc;
611     add_generated(rblock, addr_new, addr, generated, &addr_prop, &ugid, pw);
612     yield = FAIL;
613
614     SORT_MESSAGE:
615     if (!addr->message)
616       addr->message = yield == FAIL ? US"forced rejection" : US"forced defer";
617     else
618       {
619       uschar * matched;
620       if (  ob->forbid_smtp_code
621          && regex_match(regex_smtp_code, addr->message, -1, &matched))
622         {
623         DEBUG(D_route) debug_printf("SMTP code at start of error message "
624           "is ignored because forbid_smtp_code is set\n");
625         addr->message += Ustrlen(matched);
626         }
627       addr->user_message = addr->message;
628       setflag(addr, af_pass_message);
629       }
630     return yield;
631
632     /* As in the case of a system filter, a freeze does not happen after a manual
633     thaw. In case deliveries were set up by the filter, we set the child count
634     high so that their completion does not mark the original address done. */
635
636   case FF_FREEZE:
637     if (!f.deliver_manual_thaw)
638       {
639       if ((xrc = sort_errors_and_headers(rblock, addr, verify, &addr_prop))
640         != OK) return xrc;
641       add_generated(rblock, addr_new, addr, generated, &addr_prop, &ugid, pw);
642       if (addr->message == NULL) addr->message = US"frozen by filter";
643       addr->special_action = SPECIAL_FREEZE;
644       addr->child_count = 9999;
645       return DEFER;
646       }
647     frc = FF_NOTDELIVERED;
648     break;
649
650     /* Handle syntax errors and :include: failures and lookup defers */
651
652   case FF_ERROR:
653   case FF_INCLUDEFAIL:
654
655     /* If filtertype is still FILTER_UNSET, it means that the redirection data
656     was never inspected, so the error was an expansion failure or failure to open
657     the file, or whatever. In these cases, the existing error message is probably
658     sufficient. */
659
660     if (filtertype == FILTER_UNSET) return DEFER;
661
662     /* If it was a filter and skip_syntax_errors is set, we want to set up
663     the error message so that it can be logged and mailed to somebody. */
664
665     if (filtertype != FILTER_FORWARD && ob->skip_syntax_errors)
666       {
667       eblock = store_get(sizeof(error_block), GET_UNTAINTED);
668       eblock->next = NULL;
669       eblock->text1 = addr->message;
670       eblock->text2 = NULL;
671       addr->message = addr->user_message = NULL;
672       }
673
674     /* Otherwise set up the error for the address and defer. */
675
676     else
677       {
678       addr->basic_errno = ERRNO_BADREDIRECT;
679       addr->message = string_sprintf("error in %s %s: %s",
680         filtertype == FILTER_FORWARD ? "redirect" : "filter",
681         ob->data ? "data" : "file",
682         addr->message);
683       return DEFER;
684       }
685   }
686
687
688 /* Yield is either FF_DELIVERED (significant action) or FF_NOTDELIVERED (no
689 significant action). Before dealing with these, however, we must handle the
690 effect of skip_syntax_errors.
691
692 If skip_syntax_errors was set and there were syntax errors in an address list,
693 error messages will be present in eblock. Log them and send a message if so
694 configured. We cannot do this earlier, because the error message must not be
695 sent as the local user. If there were no valid addresses, generated will be
696 NULL. In this case, the router declines.
697
698 For a filter file, the error message has been fudged into an eblock. After
699 dealing with it, the router declines. */
700
701 if (eblock != NULL)
702   {
703   if (!moan_skipped_syntax_errors(
704         rblock->name,                            /* For message content */
705         eblock,                                  /* Ditto */
706         (verify != v_none || f.address_test_mode)?
707           NULL : ob->syntax_errors_to,           /* Who to mail */
708         generated != NULL,                       /* True if not all failed */
709         ob->syntax_errors_text))                 /* Custom message */
710     return DEFER;
711
712   if (filtertype != FILTER_FORWARD || !generated)
713     {
714     addr->message = US"syntax error in redirection data";
715     return DECLINE;
716     }
717   }
718
719 /* Sort out the errors address and any header modifications, and handle the
720 generated addresses, if any. If there are no generated addresses, we must avoid
721 calling sort_errors_and_headers() in case this router declines - that function
722 may modify the errors_address field in the current address, and we don't want
723 to do that for a decline. */
724
725 if (generated)
726   {
727   if ((xrc = sort_errors_and_headers(rblock, addr, verify, &addr_prop)) != OK)
728     return xrc;
729   add_generated(rblock, addr_new, addr, generated, &addr_prop, &ugid, pw);
730   }
731
732 /* FF_DELIVERED with no generated addresses is what we get when an address list
733 contains :blackhole: or a filter contains "seen finish" without having
734 generated anything. Log what happened to this address, and return DISCARD. */
735
736 if (frc == FF_DELIVERED)
737   {
738   if (generated == NULL && verify == v_none && !f.address_test_mode)
739     {
740     log_write(0, LOG_MAIN, "=> %s <%s> R=%s", discarded, addr->address,
741       rblock->name);
742     yield = DISCARD;
743     }
744   }
745
746 /* For an address list, FF_NOTDELIVERED always means that no addresses were
747 generated. For a filter, addresses may or may not have been generated. If none
748 were, it's the same as an empty address list, and the router declines. However,
749 if addresses were generated, we can't just decline because successful delivery
750 of the base address gets it marked "done", so deferred generated addresses
751 never get tried again. We have to generate a new version of the base address,
752 as if there were a "deliver" command in the filter file, with the original
753 address as parent. */
754
755 else
756   {
757   address_item *next;
758
759   if (generated == NULL) return DECLINE;
760
761   next = deliver_make_addr(addr->address, FALSE);
762   next->parent = addr;
763   addr->child_count++;
764   next->next = *addr_new;
765   *addr_new = next;
766
767   /* Set the data that propagates. */
768
769   next->prop = addr_prop;
770
771   DEBUG(D_route) debug_printf("%s router autogenerated %s\n%s%s%s",
772     rblock->name,
773     next->address,
774     (addr_prop.errors_address != NULL)? "  errors to " : "",
775     (addr_prop.errors_address != NULL)? addr_prop.errors_address : US"",
776     (addr_prop.errors_address != NULL)? "\n" : "");
777   }
778
779 /* Control gets here only when the address has been completely handled. Put the
780 original address onto the succeed queue so that any retry items that get
781 attached to it get processed. */
782
783 addr->next = *addr_succeed;
784 *addr_succeed = addr;
785
786 return yield;
787 }
788
789 #endif   /*!MACRO_PREDEF*/
790 #endif  /*ROUTER_REDIRECT*/
791 /* End of routers/redirect.c */