Track tainted data and refuse to expand it
[exim.git] / src / src / routers / rf_queue_add.c
CommitLineData
0756eb3c
PH
1/*************************************************
2* Exim - an Internet mail transport agent *
3*************************************************/
4
f9ba5e22 5/* Copyright (c) University of Cambridge 1995 - 2018 */
0756eb3c
PH
6/* See the file NOTICE for conditions of use and distribution. */
7
8#include "../exim.h"
9#include "rf_functions.h"
10
11
12/*************************************************
13* Queue address for transport *
14*************************************************/
15
16/* This function is called to put an address onto the local or remote transport
17queue, as appropriate. When the driver is for verifying only, a transport need
18not be set, in which case it doesn't actually matter which queue the address
19gets put on.
20
21The generic uid/gid options are inspected and put into the address if they are
22set. For a remote transport, if there are fallback hosts, they are added to the
23address.
24
25Arguments:
26 addr the address, with the transport field set (if not verify only)
27 paddr_local pointer to the anchor of the local transport chain
28 paddr_remote pointer to the anchor of the remote transport chain
29 rblock the router block
30 pw password entry if check_local_user was set, or NULL
31
32Returns: FALSE on error; the only case is failing to get a uid/gid
33*/
34
35BOOL
36rf_queue_add(address_item *addr, address_item **paddr_local,
37 address_item **paddr_remote, router_instance *rblock, struct passwd *pw)
38{
d43cbe25
JH
39addr->prop.domain_data = deliver_domain_data; /* Save these values for */
40addr->prop.localpart_data = deliver_localpart_data; /* use in the transport */
0756eb3c
PH
41
42/* Handle a local transport */
43
7eb0e5d2 44if (addr->transport && addr->transport->info->local)
0756eb3c
PH
45 {
46 ugid_block ugid;
47
48 /* Default uid/gid and transport-time home directory are from the passwd file
49 when check_local_user is set, but can be overridden by explicit settings.
50 When getting the home directory out of the password information, set the
51 flag that prevents expansion later. */
52
7eb0e5d2 53 if (pw)
0756eb3c
PH
54 {
55 addr->uid = pw->pw_uid;
56 addr->gid = pw->pw_gid;
7eb0e5d2
JH
57 setflag(addr, af_uid_set);
58 setflag(addr, af_gid_set);
59 setflag(addr, af_home_expanded);
0756eb3c
PH
60 addr->home_dir = string_copy(US pw->pw_dir);
61 }
62
63 if (!rf_get_ugid(rblock, addr, &ugid)) return FALSE;
64 rf_set_ugid(addr, &ugid);
65
66 /* transport_home_directory (in rblock->home_directory) takes priority;
67 otherwise use the expanded value of router_home_directory. The flag also
68 tells the transport not to re-expand it. */
69
7eb0e5d2 70 if (rblock->home_directory)
0756eb3c
PH
71 {
72 addr->home_dir = rblock->home_directory;
73 clearflag(addr, af_home_expanded);
74 }
7eb0e5d2 75 else if (!addr->home_dir && testflag(addr, af_home_expanded))
0756eb3c
PH
76 addr->home_dir = deliver_home;
77
78 addr->current_dir = rblock->current_directory;
79
80 addr->next = *paddr_local;
81 *paddr_local = addr;
82 }
83
84/* For a remote transport, set up the fallback host list, and keep a count of
85the total number of addresses routed to remote transports. */
86
87else
88 {
89 addr->fallback_hosts = rblock->fallback_hostlist;
90 addr->next = *paddr_remote;
91 *paddr_remote = addr;
92 remote_delivery_count++;
93 }
94
95DEBUG(D_route)
96 {
97 debug_printf("queued for %s transport: local_part = %s\ndomain = %s\n"
98 " errors_to=%s\n",
f3ebb786 99 addr->transport ? addr->transport->name : US"<unset>",
d43cbe25
JH
100 addr->local_part, addr->domain, addr->prop.errors_address);
101 debug_printf(" domain_data=%s localpart_data=%s\n", addr->prop.domain_data,
102 addr->prop.localpart_data);
0756eb3c
PH
103 }
104
105return TRUE;
106}
107
108/* End of rf_queue_add.c */