1 /*        $NetBSD: mail_params.c,v 1.6 2025/02/25 19:15:45 christos Exp $       */
2 
3 /*++
4 /* NAME
5 /*        mail_params 3
6 /* SUMMARY
7 /*        global mail configuration parameters
8 /* SYNOPSIS
9 /*        #include <mail_params.h>
10 /*
11 /*        char      *var_myhostname;
12 /*        char      *var_mydomain;
13 /*        char      *var_myorigin;
14 /*        char      *var_mydest;
15 /*        char      *var_relayhost;
16 /*        char      *var_transit_origin;
17 /*        char      *var_transit_dest;
18 /*        char      *var_mail_name;
19 /*        int       var_helpful_warnings;
20 /*        char      *var_syslog_name;
21 /*        char      *var_mail_owner;
22 /*        uid_t     var_owner_uid;
23 /*        gid_t     var_owner_gid;
24 /*        char      *var_sgid_group;
25 /*        gid_t     var_sgid_gid;
26 /*        char      *var_default_privs;
27 /*        uid_t     var_default_uid;
28 /*        gid_t     var_default_gid;
29 /*        char      *var_config_dir;
30 /*        char      *var_daemon_dir;
31 /*        char      *var_data_dir;
32 /*        char      *var_command_dir;
33 /*        char      *var_meta_dir;
34 /*        char      *var_queue_dir;
35 /*        char      *var_shlib_dir;
36 /*        int       var_use_limit;
37 /*        int       var_idle_limit;
38 /*        int       var_event_drain;
39 /*        int       var_bundle_rcpt;
40 /*        char      *var_procname;
41 /*        char      *var_servname;
42 /*        int       var_pid;
43 /*        int       var_ipc_timeout;
44 /*        char      *var_pid_dir;
45 /*        int       var_dont_remove;
46 /*        char      *var_inet_interfaces;
47 /*        char      *var_proxy_interfaces;
48 /*        char      *var_inet_protocols;
49 /*        char      *var_mynetworks;
50 /*        char      *var_double_bounce_sender;
51 /*        int       var_line_limit;
52 /*        char      *var_alias_db_map;
53 /*        long      var_message_limit;
54 /*        char      *var_mail_release;
55 /*        char      *var_mail_version;
56 /*        int       var_ipc_idle_limit;
57 /*        int       var_ipc_ttl_limit;
58 /*        char      *var_db_type;
59 /*        char      *var_hash_queue_names;
60 /*        int       var_hash_queue_depth;
61 /*        int       var_trigger_timeout;
62 /*        char      *var_rcpt_delim;
63 /*        int       var_fork_tries;
64 /*        int       var_fork_delay;
65 /*        int       var_flock_tries;
66 /*        int       var_flock_delay;
67 /*        int       var_flock_stale;
68 /*        int       var_disable_dns;
69 /*        int       var_soft_bounce;
70 /*        time_t    var_starttime;
71 /*        int       var_ownreq_special;
72 /*        int       var_daemon_timeout;
73 /*        char      *var_syslog_facility;
74 /*        char      *var_relay_domains;
75 /*        char      *var_fflush_domains;
76 /*        char      *var_mynetworks_style;
77 /*        char      *var_verp_delims;
78 /*        char      *var_verp_filter;
79 /*        char      *var_par_dom_match;
80 /*        char      *var_config_dirs;
81 /*
82 /*        int       var_inet_windowsize;
83 /*        char      *var_import_environ;
84 /*        char      *var_export_environ;
85 /*        char      *var_debug_peer_list;
86 /*        int       var_debug_peer_level;
87 /*        int       var_in_flow_delay;
88 /*        int       var_fault_inj_code;
89 /*        char   *var_bounce_service;
90 /*        char   *var_cleanup_service;
91 /*        char   *var_defer_service;
92 /*        char   *var_pickup_service;
93 /*        char   *var_queue_service;
94 /*        char   *var_rewrite_service;
95 /*        char   *var_showq_service;
96 /*        char   *var_error_service;
97 /*        char   *var_flush_service;
98 /*        char   *var_verify_service;
99 /*        char   *var_trace_service;
100 /*        char   *var_proxymap_service;
101 /*        char   *var_proxywrite_service;
102 /*        int       var_db_create_buf;
103 /*        int       var_db_read_buf;
104 /*        long      var_lmdb_map_size;
105 /*        int       var_proc_limit;
106 /*        int       var_mime_maxdepth;
107 /*        int       var_mime_bound_len;
108 /*        int       var_header_limit;
109 /*        int       var_token_limit;
110 /*        int       var_disable_mime_input;
111 /*        int       var_disable_mime_oconv;
112 /*        int     var_strict_8bitmime;
113 /*        int     var_strict_7bit_hdrs;
114 /*        int     var_strict_8bit_body;
115 /*        int     var_strict_encoding;
116 /*        int     var_verify_neg_cache;
117 /*        int       var_oldlog_compat;
118 /*        int       var_delay_max_res;
119 /*        char      *var_int_filt_classes;
120 /*        int       var_cyrus_sasl_authzid;
121 /*
122 /*        char      *var_multi_conf_dirs;
123 /*        char      *var_multi_wrapper;
124 /*        char      *var_multi_group;
125 /*        char      *var_multi_name;
126 /*        bool      var_multi_enable;
127 /*        bool      var_long_queue_ids;
128 /*        bool      var_daemon_open_fatal;
129 /*        char      *var_dsn_filter;
130 /*        int       var_smtputf8_enable;
131 /*        int       var_strict_smtputf8;
132 /*        char      *var_smtputf8_autoclass;
133 /*        int       var_tls_required_enable;
134 /*        int     var_idna2003_compat;
135 /*        char      *var_compatibility_level;
136 /*        char      *var_drop_hdrs;
137 /*        char      *var_info_log_addr_form;
138 /*        bool      var_enable_orcpt;
139 /*
140 /*        void      mail_params_init()
141 /*
142 /*        const     char null_format_string[1];
143 /*
144 /*        long      compatibility_level;
145 /*
146 /*        int       warn_compat_break_app_dot_mydomain;
147 /*        int       warn_compat_break_smtputf8_enable;
148 /*        int       warn_compat_break_chroot;
149 /*        int       warn_compat_break_relay_restrictions;
150 /*
151 /*        int       warn_compat_break_relay_domains;
152 /*        int       warn_compat_break_flush_domains;
153 /*        int       warn_compat_break_mynetworks_style;
154 /*
155 /*        int       warn_compat_break_smtpd_tls_fpt_dgst;
156 /*        int       warn_compat_break_smtp_tls_fpt_dgst;
157 /*        int       warn_compat_break_lmtp_tls_fpt_dgst;
158 /*        int       warn_compat_relay_before_rcpt_checks;
159 /*        int       warn_compat_respectful_logging;
160 /*
161 /*        char      *var_maillog_file;
162 /*        char      *var_maillog_file_pfxs;
163 /*        char      *var_maillog_file_comp;
164 /*        char      *var_maillog_file_stamp;
165 /*        char      *var_maillog_file_perms;
166 /*        char      *var_postlog_service;
167 /*
168 /*        char      *var_dnssec_probe;
169 /*        bool      var_relay_before_rcpt_checks;
170 /*        bool      var_respectful_logging;
171 /*        char      *var_known_tcp_ports;
172 /* DESCRIPTION
173 /*        This module (actually the associated include file) defines
174 /*        the names and defaults of all mail configuration parameters.
175 /*
176 /*        mail_params_init() initializes the built-in parameters listed above.
177 /*        These parameters are relied upon by library routines, so they are
178 /*        initialized globally so as to avoid hard-to-find errors due to
179 /*        missing initialization. This routine must be called early, at
180 /*        least before entering a chroot jail.
181 /*
182 /*        null_format_string is a workaround for gcc compilers that complain
183 /*        about empty or null format strings.
184 /*
185 /*        The warn_compat_XXX variables enable warnings for the use
186 /*        of legacy default settings after an incompatible change.
187 /* DIAGNOSTICS
188 /*        Fatal errors: out of memory; null system or domain name.
189 /* LICENSE
190 /* .ad
191 /* .fi
192 /*        The Secure Mailer license must be distributed with this software.
193 /* AUTHOR(S)
194 /*        Wietse Venema
195 /*        IBM T.J. Watson Research
196 /*        P.O. Box 704
197 /*        Yorktown Heights, NY 10598, USA
198 /*
199 /*        Wietse Venema
200 /*        Google, Inc.
201 /*        111 8th Avenue
202 /*        New York, NY 10011, USA
203 /*--*/
204 
205 /* System library. */
206 
207 #include <sys_defs.h>
208 #include <unistd.h>
209 #include <stdlib.h>
210 #include <string.h>
211 #include <pwd.h>
212 #include <grp.h>
213 #include <time.h>
214 #include <ctype.h>
215 
216 /* Utility library. */
217 
218 #include <msg.h>
219 #include <msg_syslog.h>
220 #include <get_hostname.h>
221 #include <valid_hostname.h>
222 #include <stringops.h>
223 #include <safe.h>
224 #include <safe_open.h>
225 #include <mymalloc.h>
226 #include <dict.h>
227 #include <dict_db.h>
228 #include <dict_lmdb.h>
229 #include <dict_sockmap.h>
230 #include <inet_proto.h>
231 #include <vstring_vstream.h>
232 #include <iostuff.h>
233 #include <midna_domain.h>
234 #include <logwriter.h>
235 
236 /* Global library. */
237 
238 #include <mynetworks.h>
239 #include <mail_conf.h>
240 #include <mail_version.h>
241 #include <mail_proto.h>
242 #include <verp_sender.h>
243 #include <own_inet_addr.h>
244 #include <mail_params.h>
245 #include <compat_level.h>
246 #include <config_known_tcp_ports.h>
247 
248  /*
249   * Special configuration variables.
250   */
251 char   *var_myhostname;
252 char   *var_mydomain;
253 char   *var_myorigin;
254 char   *var_mydest;
255 char   *var_relayhost;
256 char   *var_transit_origin;
257 char   *var_transit_dest;
258 char   *var_mail_name;
259 int     var_helpful_warnings;
260 char   *var_syslog_name;
261 char   *var_mail_owner;
262 uid_t   var_owner_uid;
263 gid_t   var_owner_gid;
264 char   *var_sgid_group;
265 gid_t   var_sgid_gid;
266 char   *var_default_privs;
267 uid_t   var_default_uid;
268 gid_t   var_default_gid;
269 char   *var_config_dir;
270 char   *var_daemon_dir;
271 char   *var_data_dir;
272 char   *var_command_dir;
273 char   *var_meta_dir;
274 char   *var_queue_dir;
275 char   *var_shlib_dir;
276 int     var_use_limit;
277 int     var_event_drain;
278 int     var_idle_limit;
279 int     var_bundle_rcpt;
280 char   *var_procname;
281 char   *var_servname;
282 int     var_pid;
283 int     var_ipc_timeout;
284 char   *var_pid_dir;
285 int     var_dont_remove;
286 char   *var_inet_interfaces;
287 char   *var_proxy_interfaces;
288 char   *var_inet_protocols;
289 char   *var_mynetworks;
290 char   *var_double_bounce_sender;
291 int     var_line_limit;
292 char   *var_alias_db_map;
293 long    var_message_limit;
294 char   *var_mail_release;
295 char   *var_mail_version;
296 int     var_ipc_idle_limit;
297 int     var_ipc_ttl_limit;
298 char   *var_db_type;
299 char   *var_hash_queue_names;
300 int     var_hash_queue_depth;
301 int     var_trigger_timeout;
302 char   *var_rcpt_delim;
303 int     var_fork_tries;
304 int     var_fork_delay;
305 int     var_flock_tries;
306 int     var_flock_delay;
307 int     var_flock_stale;
308 int     var_disable_dns;
309 int     var_soft_bounce;
310 time_t  var_starttime;
311 int     var_ownreq_special;
312 int     var_daemon_timeout;
313 char   *var_syslog_facility;
314 char   *var_relay_domains;
315 char   *var_fflush_domains;
316 char   *var_mynetworks_style;
317 char   *var_verp_delims;
318 char   *var_verp_filter;
319 int     var_in_flow_delay;
320 char   *var_par_dom_match;
321 char   *var_config_dirs;
322 
323 int     var_inet_windowsize;
324 char   *var_import_environ;
325 char   *var_export_environ;
326 char   *var_debug_peer_list;
327 int     var_debug_peer_level;
328 int     var_fault_inj_code;
329 char   *var_bounce_service;
330 char   *var_cleanup_service;
331 char   *var_defer_service;
332 char   *var_pickup_service;
333 char   *var_queue_service;
334 char   *var_rewrite_service;
335 char   *var_showq_service;
336 char   *var_error_service;
337 char   *var_flush_service;
338 char   *var_verify_service;
339 char   *var_trace_service;
340 char   *var_proxymap_service;
341 char   *var_proxywrite_service;
342 int     var_db_create_buf;
343 int     var_db_read_buf;
344 long    var_lmdb_map_size;
345 int     var_proc_limit;
346 int     var_mime_maxdepth;
347 int     var_mime_bound_len;
348 int     var_header_limit;
349 int     var_token_limit;
350 int     var_disable_mime_input;
351 int     var_disable_mime_oconv;
352 int     var_strict_8bitmime;
353 int     var_strict_7bit_hdrs;
354 int     var_strict_8bit_body;
355 int     var_strict_encoding;
356 int     var_verify_neg_cache;
357 int     var_oldlog_compat;
358 int     var_delay_max_res;
359 int     var_sockmap_max_reply;
360 char   *var_int_filt_classes;
361 int     var_cyrus_sasl_authzid;
362 
363 char   *var_multi_conf_dirs;
364 char   *var_multi_wrapper;
365 char   *var_multi_group;
366 char   *var_multi_name;
367 bool    var_multi_enable;
368 bool    var_long_queue_ids;
369 bool    var_daemon_open_fatal;
370 bool    var_dns_ncache_ttl_fix;
371 char   *var_dsn_filter;
372 int     var_smtputf8_enable;
373 int     var_strict_smtputf8;
374 char   *var_smtputf8_autoclass;
375 int     var_tls_required_enable;
376 int     var_idna2003_compat;
377 char   *var_compatibility_level;
378 char   *var_drop_hdrs;
379 char   *var_info_log_addr_form;
380 bool    var_enable_orcpt;
381 
382 char   *var_maillog_file;
383 char   *var_maillog_file_pfxs;
384 char   *var_maillog_file_comp;
385 char   *var_maillog_file_stamp;
386 char   *var_maillog_file_perms;
387 char   *var_postlog_service;
388 
389 char   *var_dnssec_probe;
390 bool    var_respectful_logging;
391 char   *var_known_tcp_ports;
392 
393 const char null_format_string[1] = "";
394 
395  /*
396   * Compatibility level 3.6.
397   */
398 int     warn_compat_break_smtpd_tls_fpt_dgst;
399 int     warn_compat_break_smtp_tls_fpt_dgst;
400 int     warn_compat_break_lmtp_tls_fpt_dgst;
401 int     warn_compat_relay_before_rcpt_checks;
402 int     warn_compat_respectful_logging;
403 
404  /*
405   * Compatibility level 2.
406   */
407 int     warn_compat_break_relay_domains;
408 int     warn_compat_break_flush_domains;
409 int     warn_compat_break_mynetworks_style;
410 
411  /*
412   * Compatibility level 1.
413   */
414 int     warn_compat_break_app_dot_mydomain;
415 int     warn_compat_break_smtputf8_enable;
416 int     warn_compat_break_chroot;
417 int     warn_compat_break_relay_restrictions;
418 
419  /*
420   * Parsed from var_compatibility_level;
421   */
422 long    compat_level;
423 
424 /* check_myhostname - lookup hostname and validate */
425 
check_myhostname(void)426 static const char *check_myhostname(void)
427 {
428     static const char *name;
429     const char *dot;
430     const char *domain;
431 
432     /*
433      * Use cached result.
434      */
435     if (name)
436           return (name);
437 
438     /*
439      * If the local machine name is not in FQDN form, try to append the
440      * contents of $mydomain. Use a default domain as a final workaround.
441      *
442      * DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - IT MAKES EVERY POSTFIX
443      * PROGRAM HANG WHEN DNS SERVICE IS UNAVAILABLE. IF YOU DON'T LIKE THE
444      * DEFAULT, THEN EDIT MAIN.CF.
445      */
446     name = get_hostname();
447     /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
448     if ((dot = strchr(name, '.')) == 0) {
449           /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
450           if ((domain = mail_conf_lookup_eval(VAR_MYDOMAIN)) == 0)
451               domain = DEF_MYDOMAIN;
452           /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
453           name = concatenate(name, ".", domain, (char *) 0);
454     }
455     /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
456     return (name);
457 }
458 
459 /* check_mydomainname - lookup domain name and validate */
460 
check_mydomainname(void)461 static const char *check_mydomainname(void)
462 {
463     char   *dot;
464 
465     /*
466      * Use a default domain when the hostname is not a FQDN ("foo").
467      *
468      * DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - IT MAKES EVERY POSTFIX
469      * PROGRAM HANG WHEN DNS SERVICE IS UNAVAILABLE. IF YOU DON'T LIKE THE
470      * DEFAULT, THEN EDIT MAIN.CF.
471      */
472     /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
473     if ((dot = strchr(var_myhostname, '.')) == 0)
474           /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
475           return (DEF_MYDOMAIN);
476     /* DO NOT CALL GETHOSTBYNAME OR GETNAMEINFO HERE - EDIT MAIN.CF */
477     return (dot + 1);
478 }
479 
480 /* check_default_privs - lookup default user attributes and validate */
481 
check_default_privs(void)482 static void check_default_privs(void)
483 {
484     struct passwd *pwd;
485 
486     if ((pwd = getpwnam(var_default_privs)) == 0)
487           msg_fatal("file %s/%s: parameter %s: unknown user name value: %s",
488                       var_config_dir, MAIN_CONF_FILE,
489                       VAR_DEFAULT_PRIVS, var_default_privs);
490     if ((var_default_uid = pwd->pw_uid) == 0)
491           msg_fatal("file %s/%s: parameter %s: user %s has privileged user ID",
492                       var_config_dir, MAIN_CONF_FILE,
493                       VAR_DEFAULT_PRIVS, var_default_privs);
494     if ((var_default_gid = pwd->pw_gid) == 0)
495           msg_fatal("file %s/%s: parameter %s: user %s has privileged group ID",
496                       var_config_dir, MAIN_CONF_FILE,
497                       VAR_DEFAULT_PRIVS, var_default_privs);
498 }
499 
500 /* check_mail_owner - lookup owner user attributes and validate */
501 
check_mail_owner(void)502 static void check_mail_owner(void)
503 {
504     struct passwd *pwd;
505 
506     if ((pwd = getpwnam(var_mail_owner)) == 0)
507           msg_fatal("file %s/%s: parameter %s: unknown user name value: %s",
508                       var_config_dir, MAIN_CONF_FILE,
509                       VAR_MAIL_OWNER, var_mail_owner);
510     if ((var_owner_uid = pwd->pw_uid) == 0)
511           msg_fatal("file %s/%s: parameter %s: user %s has privileged user ID",
512                       var_config_dir, MAIN_CONF_FILE,
513                       VAR_MAIL_OWNER, var_mail_owner);
514     if ((var_owner_gid = pwd->pw_gid) == 0)
515           msg_fatal("file %s/%s: parameter %s: user %s has privileged group ID",
516                       var_config_dir, MAIN_CONF_FILE,
517                       VAR_MAIL_OWNER, var_mail_owner);
518 
519     /*
520      * This detects only some forms of sharing. Enumerating the entire
521      * password file name space could be expensive. The purpose of this code
522      * is to discourage user ID sharing by developers and package
523      * maintainers.
524      */
525     if ((pwd = getpwuid(var_owner_uid)) != 0
526           && strcmp(pwd->pw_name, var_mail_owner) != 0)
527           msg_fatal("file %s/%s: parameter %s: user %s has the same"
528                       " user ID %ld as user %s",
529                       var_config_dir, MAIN_CONF_FILE,
530                       VAR_MAIL_OWNER, var_mail_owner,
531                       (long) var_owner_uid, pwd->pw_name);
532 }
533 
534 /* check_sgid_group - lookup setgid group attributes and validate */
535 
check_sgid_group(void)536 static void check_sgid_group(void)
537 {
538     struct group *grp;
539 
540     if ((grp = getgrnam(var_sgid_group)) == 0)
541           msg_fatal("file %s/%s: parameter %s: unknown group name: %s",
542                       var_config_dir, MAIN_CONF_FILE,
543                       VAR_SGID_GROUP, var_sgid_group);
544     if ((var_sgid_gid = grp->gr_gid) == 0)
545           msg_fatal("file %s/%s: parameter %s: group %s has privileged group ID",
546                       var_config_dir, MAIN_CONF_FILE,
547                       VAR_SGID_GROUP, var_sgid_group);
548 
549     /*
550      * This detects only some forms of sharing. Enumerating the entire group
551      * file name space could be expensive. The purpose of this code is to
552      * discourage group ID sharing by developers and package maintainers.
553      */
554     if ((grp = getgrgid(var_sgid_gid)) != 0
555           && strcmp(grp->gr_name, var_sgid_group) != 0)
556           msg_fatal("file %s/%s: parameter %s: group %s has the same"
557                       " group ID %ld as group %s",
558                       var_config_dir, MAIN_CONF_FILE,
559                       VAR_SGID_GROUP, var_sgid_group,
560                       (long) var_sgid_gid, grp->gr_name);
561 }
562 
563 /* check_overlap - disallow UID or GID sharing */
564 
check_overlap(void)565 static void check_overlap(void)
566 {
567     if (strcmp(var_default_privs, var_mail_owner) == 0)
568           msg_fatal("file %s/%s: parameters %s and %s specify the same user %s",
569                       var_config_dir, MAIN_CONF_FILE,
570                       VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
571                       var_default_privs);
572     if (var_default_uid == var_owner_uid)
573           msg_fatal("file %s/%s: parameters %s and %s: users %s and %s have the same user ID: %ld",
574                       var_config_dir, MAIN_CONF_FILE,
575                       VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
576                       var_default_privs, var_mail_owner,
577                       (long) var_owner_uid);
578     if (var_default_gid == var_owner_gid)
579           msg_fatal("file %s/%s: parameters %s and %s: users %s and %s have the same group ID: %ld",
580                       var_config_dir, MAIN_CONF_FILE,
581                       VAR_DEFAULT_PRIVS, VAR_MAIL_OWNER,
582                       var_default_privs, var_mail_owner,
583                       (long) var_owner_gid);
584     if (var_default_gid == var_sgid_gid)
585           msg_fatal("file %s/%s: parameters %s and %s: user %s and group %s have the same group ID: %ld",
586                       var_config_dir, MAIN_CONF_FILE,
587                       VAR_DEFAULT_PRIVS, VAR_SGID_GROUP,
588                       var_default_privs, var_sgid_group,
589                       (long) var_sgid_gid);
590     if (var_owner_gid == var_sgid_gid)
591           msg_fatal("file %s/%s: parameters %s and %s: user %s and group %s have the same group ID: %ld",
592                       var_config_dir, MAIN_CONF_FILE,
593                       VAR_MAIL_OWNER, VAR_SGID_GROUP,
594                       var_mail_owner, var_sgid_group,
595                       (long) var_sgid_gid);
596 }
597 
598 #ifdef MYORIGIN_FROM_FILE
599 
600 /* read_param_from_file - read parameter value from file */
601 
read_param_from_file(const char * path)602 static char *read_param_from_file(const char *path)
603 {
604     VSTRING *why = vstring_alloc(100);
605     VSTRING *buf = vstring_alloc(100);
606     VSTREAM *fp;
607     char   *bp;
608     char   *result;
609 
610     /*
611      * Ugly macros to make complex expressions less unreadable.
612      */
613 #define SKIP(start, var, cond) do { \
614           for (var = start; *var && (cond); var++) \
615               /* void */; \
616     } while (0)
617 
618 #define TRIM(s) do { \
619           char *p; \
620           for (p = (s) + strlen(s); p > (s) && ISSPACE(p[-1]); p--) \
621               /* void */; \
622           *p = 0; \
623     } while (0)
624 
625     fp = safe_open(path, O_RDONLY, 0, (struct stat *) 0, -1, -1, why);
626     if (fp == 0)
627           msg_fatal("%s: %s", path, vstring_str(why));
628     vstring_get_nonl(buf, fp);
629     if (vstream_ferror(fp))                       /* FIX 20070501 */
630           msg_fatal("%s: read error: %m", path);
631     vstream_fclose(fp);
632     SKIP(vstring_str(buf), bp, ISSPACE(*bp));
633     TRIM(bp);
634     result = mystrdup(bp);
635 
636     vstring_free(why);
637     vstring_free(buf);
638     return (result);
639 }
640 
641 #endif
642 
643 /* check_legacy_defaults - flag parameters that require safety-net logging */
644 
check_legacy_defaults(void)645 static void check_legacy_defaults(void)
646 {
647 
648     /*
649      * Basic idea: when an existing parameter default is changed, or a new
650      * parameter is introduced with incompatible default behavior, force
651      * Postfix to run with backwards-compatible default settings and log a
652      * warning when the backwards-compatible behavior is used.
653      *
654      * Based on a review of Postfix logging the system administrator can decide
655      * whether or not to make backwards-compatible default settings permanent
656      * in main.cf or master.cf.
657      *
658      * To turn off further warnings and deploy the new default settings, the
659      * system administrator should update the compatibility_level setting as
660      * recommended in the RELEASE_NOTES file.
661      *
662      * Each incompatible change has its own flag variable, instead of bit in a
663      * shared variable. We don't want to rip up code when we need more flag
664      * bits.
665      */
666 
667     /*
668      * Look for specific parameters whose default changed when the
669      * compatibility level changed to 3.6.
670      */
671     if (compat_level < compat_level_from_string(COMPAT_LEVEL_3_6, msg_panic)) {
672           if (mail_conf_lookup(VAR_SMTPD_TLS_FPT_DGST) == 0)
673               warn_compat_break_smtpd_tls_fpt_dgst = 1;
674           if (mail_conf_lookup(VAR_SMTP_TLS_FPT_DGST) == 0)
675               warn_compat_break_smtp_tls_fpt_dgst = 1;
676           if (mail_conf_lookup(VAR_LMTP_TLS_FPT_DGST) == 0)
677               warn_compat_break_lmtp_tls_fpt_dgst = 1;
678           if (mail_conf_lookup(VAR_RELAY_BEFORE_RCPT_CHECKS) == 0)
679               warn_compat_relay_before_rcpt_checks = 1;
680           if (mail_conf_lookup(VAR_RESPECTFUL_LOGGING) == 0)
681               warn_compat_respectful_logging = 1;
682     }
683 
684     /*
685      * Look for specific parameters whose default changed when the
686      * compatibility level changed to 2.
687      */
688     if (compat_level < compat_level_from_string(COMPAT_LEVEL_2, msg_panic)) {
689           if (mail_conf_lookup(VAR_RELAY_DOMAINS) == 0) {
690               warn_compat_break_relay_domains = 1;
691               if (mail_conf_lookup(VAR_FFLUSH_DOMAINS) == 0)
692                     warn_compat_break_flush_domains = 1;
693           }
694           if (mail_conf_lookup(VAR_MYNETWORKS) == 0
695               && mail_conf_lookup(VAR_MYNETWORKS_STYLE) == 0)
696               warn_compat_break_mynetworks_style = 1;
697     }
698 
699     /*
700      * Look for specific parameters whose default changed when the
701      * compatibility level changed from 0 to 1.
702      */
703     if (compat_level < compat_level_from_string(COMPAT_LEVEL_1, msg_panic)) {
704           if (mail_conf_lookup(VAR_APP_DOT_MYDOMAIN) == 0)
705               warn_compat_break_app_dot_mydomain = 1;
706 
707           /*
708            * Not: #ifndef NO_EAI. They must configure SMTPUTF8_ENABLE=no if a
709            * warning message is logged, so that they don't suddenly start to
710            * lose mail after Postfix is built with EAI support.
711            */
712           if (mail_conf_lookup(VAR_SMTPUTF8_ENABLE) == 0)
713               warn_compat_break_smtputf8_enable = 1;
714           warn_compat_break_chroot = 1;
715 
716           /*
717            * Grandfathered in to help sites migrating from Postfix <2.10.
718            */
719           if (mail_conf_lookup(VAR_RELAY_CHECKS) == 0)
720               warn_compat_break_relay_restrictions = 1;
721     }
722 }
723 
724 /* mail_params_init - configure built-in parameters */
725 
mail_params_init()726 void    mail_params_init()
727 {
728     static const CONFIG_STR_TABLE compat_level_defaults[] = {
729           VAR_COMPAT_LEVEL, DEF_COMPAT_LEVEL, &var_compatibility_level, 0, 0,
730           0,
731     };
732     static const CONFIG_STR_TABLE first_str_defaults[] = {
733           /* $mail_version may appear in other parameters. */
734           VAR_MAIL_VERSION, DEF_MAIL_VERSION, &var_mail_version, 1, 0,
735           VAR_SYSLOG_FACILITY, DEF_SYSLOG_FACILITY, &var_syslog_facility, 1, 0,
736           VAR_INET_PROTOCOLS, DEF_INET_PROTOCOLS, &var_inet_protocols, 0, 0,
737           VAR_MULTI_CONF_DIRS, DEF_MULTI_CONF_DIRS, &var_multi_conf_dirs, 0, 0,
738           /* multi_instance_wrapper may have dependencies but not dependents. */
739           VAR_MULTI_GROUP, DEF_MULTI_GROUP, &var_multi_group, 0, 0,
740           VAR_MULTI_NAME, DEF_MULTI_NAME, &var_multi_name, 0, 0,
741           VAR_MAILLOG_FILE, DEF_MAILLOG_FILE, &var_maillog_file, 0, 0,
742           VAR_MAILLOG_FILE_PFXS, DEF_MAILLOG_FILE_PFXS, &var_maillog_file_pfxs, 1, 0,
743           VAR_MAILLOG_FILE_COMP, DEF_MAILLOG_FILE_COMP, &var_maillog_file_comp, 1, 0,
744           VAR_MAILLOG_FILE_STAMP, DEF_MAILLOG_FILE_STAMP, &var_maillog_file_stamp, 1, 0,
745           VAR_MAILLOG_FILE_PERMS, DEF_MAILLOG_FILE_PERMS, &var_maillog_file_perms, 1, 0,
746           VAR_POSTLOG_SERVICE, DEF_POSTLOG_SERVICE, &var_postlog_service, 1, 0,
747           VAR_DNSSEC_PROBE, DEF_DNSSEC_PROBE, &var_dnssec_probe, 0, 0,
748           VAR_KNOWN_TCP_PORTS, DEF_KNOWN_TCP_PORTS, &var_known_tcp_ports, 0, 0,
749           0,
750     };
751     static const CONFIG_BOOL_TABLE first_bool_defaults[] = {
752           /* read and process the following before opening tables. */
753           VAR_DAEMON_OPEN_FATAL, DEF_DAEMON_OPEN_FATAL, &var_daemon_open_fatal,
754           VAR_DNS_NCACHE_TTL_FIX, DEF_DNS_NCACHE_TTL_FIX, &var_dns_ncache_ttl_fix,
755           0,
756     };
757     static const CONFIG_NBOOL_TABLE first_nbool_defaults[] = {
758           /* read and process the following before opening tables. */
759           VAR_SMTPUTF8_ENABLE, DEF_SMTPUTF8_ENABLE, &var_smtputf8_enable,
760           VAR_IDNA2003_COMPAT, DEF_IDNA2003_COMPAT, &var_idna2003_compat,
761           VAR_RESPECTFUL_LOGGING, DEF_RESPECTFUL_LOGGING, &var_respectful_logging,
762           VAR_TLSREQUIRED_ENABLE, DEF_TLSREQUIRED_ENABLE, &var_tls_required_enable,
763           0,
764     };
765     static const CONFIG_STR_FN_TABLE function_str_defaults[] = {
766           VAR_MYHOSTNAME, check_myhostname, &var_myhostname, 1, 0,
767           VAR_MYDOMAIN, check_mydomainname, &var_mydomain, 1, 0,
768           0,
769     };
770     static const CONFIG_STR_TABLE other_str_defaults[] = {
771           VAR_MAIL_NAME, DEF_MAIL_NAME, &var_mail_name, 1, 0,
772           VAR_SYSLOG_NAME, DEF_SYSLOG_NAME, &var_syslog_name, 1, 0,
773           VAR_MAIL_OWNER, DEF_MAIL_OWNER, &var_mail_owner, 1, 0,
774           VAR_SGID_GROUP, DEF_SGID_GROUP, &var_sgid_group, 1, 0,
775           VAR_MYDEST, DEF_MYDEST, &var_mydest, 0, 0,
776           VAR_MYORIGIN, DEF_MYORIGIN, &var_myorigin, 1, 0,
777           VAR_RELAYHOST, DEF_RELAYHOST, &var_relayhost, 0, 0,
778           VAR_DAEMON_DIR, DEF_DAEMON_DIR, &var_daemon_dir, 1, 0,
779           VAR_DATA_DIR, DEF_DATA_DIR, &var_data_dir, 1, 0,
780           VAR_COMMAND_DIR, DEF_COMMAND_DIR, &var_command_dir, 1, 0,
781           VAR_META_DIR, DEF_META_DIR, &var_meta_dir, 1, 0,
782           VAR_QUEUE_DIR, DEF_QUEUE_DIR, &var_queue_dir, 1, 0,
783           VAR_SHLIB_DIR, DEF_SHLIB_DIR, &var_shlib_dir, 1, 0,
784           VAR_PID_DIR, DEF_PID_DIR, &var_pid_dir, 1, 0,
785           VAR_INET_INTERFACES, DEF_INET_INTERFACES, &var_inet_interfaces, 0, 0,
786           VAR_PROXY_INTERFACES, DEF_PROXY_INTERFACES, &var_proxy_interfaces, 0, 0,
787           VAR_DOUBLE_BOUNCE, DEF_DOUBLE_BOUNCE, &var_double_bounce_sender, 1, 0,
788           VAR_DEFAULT_PRIVS, DEF_DEFAULT_PRIVS, &var_default_privs, 1, 0,
789           VAR_ALIAS_DB_MAP, DEF_ALIAS_DB_MAP, &var_alias_db_map, 0, 0,
790           VAR_MAIL_RELEASE, DEF_MAIL_RELEASE, &var_mail_release, 1, 0,
791           VAR_DB_TYPE, DEF_DB_TYPE, &var_db_type, 1, 0,
792           VAR_HASH_QUEUE_NAMES, DEF_HASH_QUEUE_NAMES, &var_hash_queue_names, 1, 0,
793           VAR_RCPT_DELIM, DEF_RCPT_DELIM, &var_rcpt_delim, 0, 0,
794           VAR_RELAY_DOMAINS, DEF_RELAY_DOMAINS, &var_relay_domains, 0, 0,
795           VAR_FFLUSH_DOMAINS, DEF_FFLUSH_DOMAINS, &var_fflush_domains, 0, 0,
796           VAR_EXPORT_ENVIRON, DEF_EXPORT_ENVIRON, &var_export_environ, 0, 0,
797           VAR_IMPORT_ENVIRON, DEF_IMPORT_ENVIRON, &var_import_environ, 0, 0,
798           VAR_MYNETWORKS_STYLE, DEF_MYNETWORKS_STYLE, &var_mynetworks_style, 1, 0,
799           VAR_DEBUG_PEER_LIST, DEF_DEBUG_PEER_LIST, &var_debug_peer_list, 0, 0,
800           VAR_VERP_DELIMS, DEF_VERP_DELIMS, &var_verp_delims, 2, 2,
801           VAR_VERP_FILTER, DEF_VERP_FILTER, &var_verp_filter, 1, 0,
802           VAR_PAR_DOM_MATCH, DEF_PAR_DOM_MATCH, &var_par_dom_match, 0, 0,
803           VAR_CONFIG_DIRS, DEF_CONFIG_DIRS, &var_config_dirs, 0, 0,
804           VAR_BOUNCE_SERVICE, DEF_BOUNCE_SERVICE, &var_bounce_service, 1, 0,
805           VAR_CLEANUP_SERVICE, DEF_CLEANUP_SERVICE, &var_cleanup_service, 1, 0,
806           VAR_DEFER_SERVICE, DEF_DEFER_SERVICE, &var_defer_service, 1, 0,
807           VAR_PICKUP_SERVICE, DEF_PICKUP_SERVICE, &var_pickup_service, 1, 0,
808           VAR_QUEUE_SERVICE, DEF_QUEUE_SERVICE, &var_queue_service, 1, 0,
809           VAR_REWRITE_SERVICE, DEF_REWRITE_SERVICE, &var_rewrite_service, 1, 0,
810           VAR_SHOWQ_SERVICE, DEF_SHOWQ_SERVICE, &var_showq_service, 1, 0,
811           VAR_ERROR_SERVICE, DEF_ERROR_SERVICE, &var_error_service, 1, 0,
812           VAR_FLUSH_SERVICE, DEF_FLUSH_SERVICE, &var_flush_service, 1, 0,
813           VAR_VERIFY_SERVICE, DEF_VERIFY_SERVICE, &var_verify_service, 1, 0,
814           VAR_TRACE_SERVICE, DEF_TRACE_SERVICE, &var_trace_service, 1, 0,
815           VAR_PROXYMAP_SERVICE, DEF_PROXYMAP_SERVICE, &var_proxymap_service, 1, 0,
816           VAR_PROXYWRITE_SERVICE, DEF_PROXYWRITE_SERVICE, &var_proxywrite_service, 1, 0,
817           VAR_INT_FILT_CLASSES, DEF_INT_FILT_CLASSES, &var_int_filt_classes, 0, 0,
818           /* multi_instance_wrapper may have dependencies but not dependents. */
819           VAR_MULTI_WRAPPER, DEF_MULTI_WRAPPER, &var_multi_wrapper, 0, 0,
820           VAR_DSN_FILTER, DEF_DSN_FILTER, &var_dsn_filter, 0, 0,
821           VAR_SMTPUTF8_AUTOCLASS, DEF_SMTPUTF8_AUTOCLASS, &var_smtputf8_autoclass, 1, 0,
822           VAR_DROP_HDRS, DEF_DROP_HDRS, &var_drop_hdrs, 0, 0,
823           VAR_INFO_LOG_ADDR_FORM, DEF_INFO_LOG_ADDR_FORM, &var_info_log_addr_form, 1, 0,
824           0,
825     };
826     static const CONFIG_STR_FN_TABLE function_str_defaults_2[] = {
827           VAR_MYNETWORKS, mynetworks, &var_mynetworks, 0, 0,
828           0,
829     };
830     static const CONFIG_INT_TABLE other_int_defaults[] = {
831           VAR_PROC_LIMIT, DEF_PROC_LIMIT, &var_proc_limit, 1, 0,
832           VAR_MAX_USE, DEF_MAX_USE, &var_use_limit, 1, 0,
833           VAR_DONT_REMOVE, DEF_DONT_REMOVE, &var_dont_remove, 0, 0,
834           VAR_LINE_LIMIT, DEF_LINE_LIMIT, &var_line_limit, 512, 0,
835           VAR_HASH_QUEUE_DEPTH, DEF_HASH_QUEUE_DEPTH, &var_hash_queue_depth, 1, 0,
836           VAR_FORK_TRIES, DEF_FORK_TRIES, &var_fork_tries, 1, 0,
837           VAR_FLOCK_TRIES, DEF_FLOCK_TRIES, &var_flock_tries, 1, 0,
838           VAR_DEBUG_PEER_LEVEL, DEF_DEBUG_PEER_LEVEL, &var_debug_peer_level, 1, 0,
839           VAR_FAULT_INJ_CODE, DEF_FAULT_INJ_CODE, &var_fault_inj_code, 0, 0,
840           VAR_DB_CREATE_BUF, DEF_DB_CREATE_BUF, &var_db_create_buf, 1, 0,
841           VAR_DB_READ_BUF, DEF_DB_READ_BUF, &var_db_read_buf, 1, 0,
842           VAR_HEADER_LIMIT, DEF_HEADER_LIMIT, &var_header_limit, 1, 0,
843           VAR_TOKEN_LIMIT, DEF_TOKEN_LIMIT, &var_token_limit, 1, 0,
844           VAR_MIME_MAXDEPTH, DEF_MIME_MAXDEPTH, &var_mime_maxdepth, 1, 0,
845           VAR_MIME_BOUND_LEN, DEF_MIME_BOUND_LEN, &var_mime_bound_len, 1, 0,
846           VAR_DELAY_MAX_RES, DEF_DELAY_MAX_RES, &var_delay_max_res, MIN_DELAY_MAX_RES, MAX_DELAY_MAX_RES,
847           VAR_INET_WINDOW, DEF_INET_WINDOW, &var_inet_windowsize, 0, 0,
848           VAR_SOCKMAP_MAX_REPLY, DEF_SOCKMAP_MAX_REPLY, &var_sockmap_max_reply, 1, 0,
849           0,
850     };
851     static const CONFIG_LONG_TABLE long_defaults[] = {
852           VAR_MESSAGE_LIMIT, DEF_MESSAGE_LIMIT, &var_message_limit, 0, 0,
853           VAR_LMDB_MAP_SIZE, DEF_LMDB_MAP_SIZE, &var_lmdb_map_size, 1, 0,
854           0,
855     };
856     static const CONFIG_TIME_TABLE time_defaults[] = {
857           VAR_EVENT_DRAIN, DEF_EVENT_DRAIN, &var_event_drain, 1, 0,
858           VAR_MAX_IDLE, DEF_MAX_IDLE, &var_idle_limit, 1, 0,
859           VAR_IPC_TIMEOUT, DEF_IPC_TIMEOUT, &var_ipc_timeout, 1, 0,
860           VAR_IPC_IDLE, DEF_IPC_IDLE, &var_ipc_idle_limit, 1, 0,
861           VAR_IPC_TTL, DEF_IPC_TTL, &var_ipc_ttl_limit, 1, 0,
862           VAR_TRIGGER_TIMEOUT, DEF_TRIGGER_TIMEOUT, &var_trigger_timeout, 1, 0,
863           VAR_FORK_DELAY, DEF_FORK_DELAY, &var_fork_delay, 1, 0,
864           VAR_FLOCK_DELAY, DEF_FLOCK_DELAY, &var_flock_delay, 1, 0,
865           VAR_FLOCK_STALE, DEF_FLOCK_STALE, &var_flock_stale, 1, 0,
866           VAR_DAEMON_TIMEOUT, DEF_DAEMON_TIMEOUT, &var_daemon_timeout, 1, 0,
867           VAR_IN_FLOW_DELAY, DEF_IN_FLOW_DELAY, &var_in_flow_delay, 0, 10,
868           0,
869     };
870     static const CONFIG_BOOL_TABLE bool_defaults[] = {
871           VAR_DISABLE_DNS, DEF_DISABLE_DNS, &var_disable_dns,
872           VAR_SOFT_BOUNCE, DEF_SOFT_BOUNCE, &var_soft_bounce,
873           VAR_OWNREQ_SPECIAL, DEF_OWNREQ_SPECIAL, &var_ownreq_special,
874           VAR_STRICT_8BITMIME, DEF_STRICT_8BITMIME, &var_strict_8bitmime,
875           VAR_STRICT_7BIT_HDRS, DEF_STRICT_7BIT_HDRS, &var_strict_7bit_hdrs,
876           VAR_STRICT_8BIT_BODY, DEF_STRICT_8BIT_BODY, &var_strict_8bit_body,
877           VAR_STRICT_ENCODING, DEF_STRICT_ENCODING, &var_strict_encoding,
878           VAR_DISABLE_MIME_INPUT, DEF_DISABLE_MIME_INPUT, &var_disable_mime_input,
879           VAR_DISABLE_MIME_OCONV, DEF_DISABLE_MIME_OCONV, &var_disable_mime_oconv,
880           VAR_VERIFY_NEG_CACHE, DEF_VERIFY_NEG_CACHE, &var_verify_neg_cache,
881           VAR_OLDLOG_COMPAT, DEF_OLDLOG_COMPAT, &var_oldlog_compat,
882           VAR_HELPFUL_WARNINGS, DEF_HELPFUL_WARNINGS, &var_helpful_warnings,
883           VAR_CYRUS_SASL_AUTHZID, DEF_CYRUS_SASL_AUTHZID, &var_cyrus_sasl_authzid,
884           VAR_MULTI_ENABLE, DEF_MULTI_ENABLE, &var_multi_enable,
885           VAR_LONG_QUEUE_IDS, DEF_LONG_QUEUE_IDS, &var_long_queue_ids,
886           VAR_STRICT_SMTPUTF8, DEF_STRICT_SMTPUTF8, &var_strict_smtputf8,
887           VAR_ENABLE_ORCPT, DEF_ENABLE_ORCPT, &var_enable_orcpt,
888           0,
889     };
890     const char *cp;
891 
892     /*
893      * Extract compatibility level first, so that we can determine what
894      * parameters of interest are left at their legacy defaults.
895      */
896     if (var_compatibility_level == 0)
897           compat_level_relop_register();
898     get_mail_conf_str_table(compat_level_defaults);
899     compat_level = compat_level_from_string(var_compatibility_level, msg_fatal);
900     check_legacy_defaults();
901 
902     /*
903      * Extract syslog_facility early, so that from here on all errors are
904      * logged with the proper facility.
905      */
906     get_mail_conf_str_table(first_str_defaults);
907 
908     if (!msg_syslog_set_facility(var_syslog_facility))
909           msg_fatal("file %s/%s: parameter %s: unrecognized value: %s",
910                       var_config_dir, MAIN_CONF_FILE,
911                       VAR_SYSLOG_FACILITY, var_syslog_facility);
912 
913     /*
914      * Should daemons terminate after table open error, or should they
915      * continue execution with reduced functionality?
916      */
917     get_mail_conf_bool_table(first_bool_defaults);
918     if (var_daemon_open_fatal)
919           dict_allow_surrogate = 0;
920 
921     /*
922      * Should we open tables with UTF8 support, or in the legacy 8-bit clean
923      * mode with ASCII-only casefolding?
924      */
925     get_mail_conf_nbool_table(first_nbool_defaults);
926 
927     /*
928      * Report run-time versus compile-time discrepancies.
929      */
930 #ifdef NO_EAI
931     if (var_smtputf8_enable)
932           msg_warn("%s is true, but EAI support is not compiled in",
933                      VAR_SMTPUTF8_ENABLE);
934     var_smtputf8_enable = 0;
935 #else
936     midna_domain_transitional = var_idna2003_compat;
937     if (var_smtputf8_enable)
938           midna_domain_pre_chroot();
939 #endif
940     util_utf8_enable = var_smtputf8_enable;
941 
942     /*
943      * Configure the known TCP port mappings.
944      */
945     config_known_tcp_ports(VAR_KNOWN_TCP_PORTS, var_known_tcp_ports);
946 
947     /*
948      * What protocols should we attempt to support? The result is stored in
949      * the global inet_proto_table variable.
950      */
951     (void) inet_proto_init(VAR_INET_PROTOCOLS, var_inet_protocols);
952 
953     /*
954      * Variables whose defaults are determined at runtime. Some sites use
955      * short hostnames in the host table; some sites name their system after
956      * the domain.
957      */
958     get_mail_conf_str_fn_table(function_str_defaults);
959     if (!valid_hostname(var_myhostname, DO_GRIPE))
960           msg_fatal("file %s/%s: parameter %s: bad parameter value: %s",
961                       var_config_dir, MAIN_CONF_FILE,
962                       VAR_MYHOSTNAME, var_myhostname);
963     if (!valid_hostname(var_mydomain, DO_GRIPE))
964           msg_fatal("file %s/%s: parameter %s: bad parameter value: %s",
965                       var_config_dir, MAIN_CONF_FILE,
966                       VAR_MYDOMAIN, var_mydomain);
967 
968     /*
969      * Variables that are needed by almost every program.
970      *
971      * XXX Reading the myorigin value from file is originally a Debian Linux
972      * feature. This code is not enabled by default because of problems: 1)
973      * it re-implements its own parameter syntax checks, and 2) it does not
974      * implement $name expansions.
975      */
976     get_mail_conf_str_table(other_str_defaults);
977 #ifdef MYORIGIN_FROM_FILE
978     if (*var_myorigin == '/') {
979           char   *origin = read_param_from_file(var_myorigin);
980 
981           if (*origin == 0)
982               msg_fatal("%s file %s is empty", VAR_MYORIGIN, var_myorigin);
983           myfree(var_myorigin);                             /* FIX 20070501 */
984           var_myorigin = origin;
985     }
986 #endif
987     get_mail_conf_int_table(other_int_defaults);
988     get_mail_conf_long_table(long_defaults);
989     get_mail_conf_bool_table(bool_defaults);
990     get_mail_conf_time_table(time_defaults);
991     check_default_privs();
992     check_mail_owner();
993     check_sgid_group();
994     check_overlap();
995     dict_db_cache_size = var_db_read_buf;
996     dict_lmdb_map_size = var_lmdb_map_size;
997     dict_sockmap_max_reply = var_sockmap_max_reply;
998     inet_windowsize = var_inet_windowsize;
999     if (set_logwriter_create_perms(var_maillog_file_perms) < 0)
1000           msg_warn("ignoring bad permissions: %s = %s",
1001                      VAR_MAILLOG_FILE_PERMS, var_maillog_file_perms);
1002 
1003     /*
1004      * Variables whose defaults are determined at runtime, after other
1005      * variables have been set. This dependency is admittedly a bit tricky.
1006      * XXX Perhaps we should just register variables, and let the evaluator
1007      * figure out in what order to evaluate things.
1008      */
1009     get_mail_conf_str_fn_table(function_str_defaults_2);
1010 
1011     /*
1012      * FIX 200412 The IPv6 patch did not call own_inet_addr_list() before
1013      * entering the chroot jail on Linux IPv6 systems. Linux has the IPv6
1014      * interface list in /proc, which is not available after chrooting.
1015      */
1016     (void) own_inet_addr_list();
1017 
1018     /*
1019      * The PID variable cannot be set from the configuration file!!
1020      */
1021     set_mail_conf_int(VAR_PID, var_pid = getpid());
1022 
1023     /*
1024      * Neither can the start time variable. It isn't even visible.
1025      */
1026     time(&var_starttime);
1027 
1028     /*
1029      * Export the syslog name so children can inherit and use it before they
1030      * have initialized.
1031      */
1032     if ((cp = safe_getenv(CONF_ENV_LOGTAG)) == 0
1033           || strcmp(cp, var_syslog_name) != 0)
1034           if (setenv(CONF_ENV_LOGTAG, var_syslog_name, 1) < 0)
1035               msg_fatal("setenv %s %s: %m", CONF_ENV_LOGTAG, var_syslog_name);
1036 
1037     /*
1038      * I have seen this happen just too often.
1039      */
1040     if (strcasecmp_utf8(var_myhostname, var_relayhost) == 0)
1041           msg_fatal("%s and %s parameter settings must not be identical: %s",
1042                       VAR_MYHOSTNAME, VAR_RELAYHOST, var_myhostname);
1043 
1044     /*
1045      * XXX These should be caught by a proper parameter parsing algorithm.
1046      */
1047     if (var_myorigin[strcspn(var_myorigin, CHARS_COMMA_SP)])
1048           msg_fatal("%s parameter setting must not contain multiple values: %s",
1049                       VAR_MYORIGIN, var_myorigin);
1050 
1051     /*
1052      * One more sanity check.
1053      */
1054     if ((cp = verp_delims_verify(var_verp_delims)) != 0)
1055           msg_fatal("file %s/%s: parameters %s and %s: %s",
1056                       var_config_dir, MAIN_CONF_FILE,
1057                       VAR_VERP_DELIMS, VAR_VERP_FILTER, cp);
1058 }
1059