X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/afd5e75ffc8f64f0ebed1df9dce64793011c14a6..46d2a5e6f6e7709d172903b13945d23fc0a2c888:/src/src/exim.c diff --git a/src/src/exim.c b/src/src/exim.c index 4e4b6bb75..10526ba5f 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -309,6 +309,7 @@ milliwait(struct itimerval *itval) { sigset_t sigmask; sigset_t old_sigmask; +int save_errno = errno; if (itval->it_value.tv_usec < 50 && itval->it_value.tv_sec == 0) return; @@ -322,6 +323,8 @@ if (setitimer(ITIMER_REAL, itval, NULL) < 0) /* Start timer */ (void)sigdelset(&sigmask, SIGALRM); /* Remove SIGALRM */ (void)sigsuspend(&sigmask); /* Until SIGALRM */ (void)sigprocmask(SIG_SETMASK, &old_sigmask, NULL); /* Restore mask */ +errno = save_errno; +sigalrm_seen = FALSE; } @@ -342,11 +345,9 @@ Returns: nothing void millisleep(int msec) { -struct itimerval itval; -itval.it_interval.tv_sec = 0; -itval.it_interval.tv_usec = 0; -itval.it_value.tv_sec = msec/1000; -itval.it_value.tv_usec = (msec % 1000) * 1000; +struct itimerval itval = {.it_interval = {.tv_sec = 0, .tv_usec = 0}, + .it_value = {.tv_sec = msec/1000, + .tv_usec = (msec % 1000) * 1000}}; milliwait(&itval); } @@ -714,26 +715,26 @@ Returns: does not return */ void -exim_exit(int rc, const uschar * process) +exim_exit(int rc) { search_tidyup(); store_exit(); DEBUG(D_any) - debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d %s%s%sterminating with rc=%d " - ">>>>>>>>>>>>>>>>\n", (int)getpid(), - process ? "(" : "", process, process ? ") " : "", rc); + debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d (%s) terminating with rc=%d " + ">>>>>>>>>>>>>>>>\n", + (int)getpid(), process_purpose, rc); exit(rc); } void -exim_underbar_exit(int rc, const uschar * process) +exim_underbar_exit(int rc) { store_exit(); DEBUG(D_any) - debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d %s%s%sterminating with rc=%d " - ">>>>>>>>>>>>>>>>\n", (int)getpid(), - process ? "(" : "", process, process ? ") " : "", rc); + debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d (%s) terminating with rc=%d " + ">>>>>>>>>>>>>>>>\n", + (int)getpid(), process_purpose, rc); _exit(rc); } @@ -830,7 +831,7 @@ int start, end, domain; uschar *parse_error = NULL; uschar *address = parse_extract_address(s, &parse_error, &start, &end, &domain, FALSE); -if (address == NULL) +if (!address) { fprintf(stdout, "syntax error: %s\n", parse_error); *exit_value = 2; @@ -1954,8 +1955,8 @@ on the second character (the one after '-'), to save some effort. */ for (i = 1; i < argc; i++) { BOOL badarg = FALSE; - uschar *arg = argv[i]; - uschar *argrest; + uschar * arg = argv[i]; + uschar * argrest; int switchchar; /* An argument not starting with '-' is the start of a recipients list; @@ -2034,7 +2035,7 @@ for (i = 1; i < argc; i++) /* sendmail uses -Ac and -Am to control which .cf file is used; we ignore them. */ case 'A': - if (*argrest == '\0') { badarg = TRUE; break; } + if (!*argrest) { badarg = TRUE; break; } else { BOOL ignore = FALSE; @@ -2090,9 +2091,9 @@ for (i = 1; i < argc; i++) /* -bF: Run system filter test */ case 'F': filter_test |= checking = FTEST_SYSTEM; - if (*argrest) { badarg = TRUE; break; } - if (++i < argc) filter_test_sfile = argv[i]; else - exim_fail("exim: file name expected after %s\n", argv[i-1]); + if (*argrest) badarg = TRUE; + else if (++i < argc) filter_test_sfile = argv[i]; + else exim_fail("exim: file name expected after %s\n", argv[i-1]); break; /* -bf: Run user filter test @@ -2125,7 +2126,7 @@ for (i = 1; i < argc; i++) if (!*argrest || Ustrcmp(argrest, "c") == 0) { if (++i >= argc) { badarg = TRUE; break; } - sender_host_address = argv[i]; + sender_host_address = string_copy_taint(argv[i], TRUE); host_checking = checking = f.log_testing_mode = TRUE; f.host_checking_callout = *argrest == 'c'; message_logs = FALSE; @@ -2344,11 +2345,8 @@ for (i = 1; i < argc; i++) a change! Enforce a prefix check if required. */ case 'C': - if (*argrest == 0) - { - if(++i < argc) argrest = argv[i]; else - { badarg = TRUE; break; } - } + if (!*argrest) + if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; } if (Ustrcmp(config_main_filelist, argrest) != 0) { #ifdef ALT_CONFIG_PREFIX @@ -2357,14 +2355,14 @@ for (i = 1; i < argc; i++) const uschar *list = argrest; uschar *filename; while((filename = string_nextinlist(&list, &sep, big_buffer, - big_buffer_size)) != NULL) - { - if ((Ustrlen(filename) < len || - Ustrncmp(filename, ALT_CONFIG_PREFIX, len) != 0 || - Ustrstr(filename, "/../") != NULL) && - (Ustrcmp(filename, "/dev/null") != 0 || real_uid != root_uid)) + big_buffer_size))) + if ( ( Ustrlen(filename) < len + || Ustrncmp(filename, ALT_CONFIG_PREFIX, len) != 0 + || Ustrstr(filename, "/../") != NULL + ) + && (Ustrcmp(filename, "/dev/null") != 0 || real_uid != root_uid) + ) exim_fail("-C Permission denied\n"); - } #endif if (real_uid != root_uid) { @@ -2419,7 +2417,7 @@ for (i = 1; i < argc; i++) if (nl) *nl = 0; trusted_configs[nr_configs++] = string_copy(start); - if (nr_configs == 32) + if (nr_configs == nelem(trusted_configs)) break; } fclose(trust_list); @@ -2430,7 +2428,7 @@ for (i = 1; i < argc; i++) const uschar *list = argrest; uschar *filename; while (f.trusted_config && (filename = string_nextinlist(&list, - &sep, big_buffer, big_buffer_size)) != NULL) + &sep, big_buffer, big_buffer_size))) { for (i=0; i < nr_configs; i++) if (Ustrcmp(filename, trusted_configs[i]) == 0) @@ -2532,7 +2530,7 @@ for (i = 1; i < argc; i++) f.debug_daemon = TRUE; argrest++; } - if (*argrest != 0) + if (*argrest) decode_bits(&selector, 1, debug_notall, argrest, debug_options, debug_options_count, US"debug", 0); debug_selector = selector; @@ -2579,12 +2577,9 @@ for (i = 1; i < argc; i++) the -F or be in the next argument. */ case 'F': - if (*argrest == 0) - { - if(++i < argc) argrest = argv[i]; else - { badarg = TRUE; break; } - } - originator_name = argrest; + if (!*argrest) + if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; } + originator_name = string_copy_taint(argrest, TRUE); f.sender_name_forced = TRUE; break; @@ -2608,16 +2603,13 @@ for (i = 1; i < argc; i++) { int dummy_start, dummy_end; uschar *errmess; - if (*argrest == 0) - { - if (i+1 < argc) argrest = argv[++i]; else - { badarg = TRUE; break; } - } - if (*argrest == 0) + if (!*argrest) + if (i+1 < argc) argrest = argv[++i]; else { badarg = TRUE; break; } + if (!*argrest) *(sender_address = store_get(1, FALSE)) = '\0'; /* Ensure writeable memory */ else { - uschar *temp = argrest + Ustrlen(argrest) - 1; + uschar * temp = argrest + Ustrlen(argrest) - 1; while (temp >= argrest && isspace(*temp)) temp--; if (temp >= argrest && *temp == '.') f_end_dot = TRUE; allow_domain_literals = TRUE; @@ -2625,8 +2617,10 @@ for (i = 1; i < argc; i++) #ifdef SUPPORT_I18N allow_utf8_domains = TRUE; #endif - sender_address = parse_extract_address(argrest, &errmess, - &dummy_start, &dummy_end, &sender_address_domain, TRUE); + if (!(sender_address = parse_extract_address(argrest, &errmess, + &dummy_start, &dummy_end, &sender_address_domain, TRUE))) + exim_fail("exim: bad -f address \"%s\": %s\n", argrest, errmess); + sender_address = string_copy_taint(sender_address, TRUE); #ifdef SUPPORT_I18N message_smtputf8 = string_is_utf8(sender_address); @@ -2634,8 +2628,6 @@ for (i = 1; i < argc; i++) #endif allow_domain_literals = FALSE; strip_trailing_dot = FALSE; - if (!sender_address) - exim_fail("exim: bad -f address \"%s\": %s\n", argrest, errmess); } f.sender_address_forced = TRUE; } @@ -2655,11 +2647,8 @@ for (i = 1; i < argc; i++) To put it in will require a change to the spool header file format. */ case 'h': - if (*argrest == 0) - { - if(++i < argc) argrest = argv[i]; else - { badarg = TRUE; break; } - } + if (!*argrest) + if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; } if (!isdigit(*argrest)) badarg = TRUE; break; @@ -2668,7 +2657,7 @@ for (i = 1; i < argc; i++) not to be documented for sendmail but mailx (at least) uses it) */ case 'i': - if (*argrest == 0) f.dot_ends = FALSE; else badarg = TRUE; + if (!*argrest) f.dot_ends = FALSE; else badarg = TRUE; break; @@ -2676,16 +2665,13 @@ for (i = 1; i < argc; i++) syslog_processname in the config file, but needs to be an admin option. */ case 'L': - if (*argrest == '\0') - { - if(++i < argc) argrest = argv[i]; else - { badarg = TRUE; break; } - } + if (!*argrest) + if (++i < argc) argrest = argv[i]; else { badarg = TRUE; break; } if ((sz = Ustrlen(argrest)) > 32) exim_fail("exim: the -L syslog name is too long: \"%s\"\n", argrest); if (sz < 1) exim_fail("exim: the -L syslog name is too short\n"); - cmdline_syslog_name = argrest; + cmdline_syslog_name = string_copy_taint(argrest, TRUE); break; case 'M': @@ -2715,9 +2701,9 @@ for (i = 1; i < argc; i++) if (msg_action_arg >= 0) exim_fail("exim: incompatible arguments\n"); - continue_transport = argv[++i]; - continue_hostname = argv[++i]; - continue_host_address = argv[++i]; + continue_transport = string_copy_taint(argv[++i], TRUE); + continue_hostname = string_copy_taint(argv[++i], TRUE); + continue_host_address = string_copy_taint(argv[++i], TRUE); continue_sequence = Uatoi(argv[++i]); msg_action = MSG_DELIVER; msg_action_arg = ++i; @@ -2759,9 +2745,16 @@ for (i = 1; i < argc; i++) case 'D': smtp_peer_options |= OPTION_DSN; break; + /* -MCd: for debug, set a process-purpose string */ + + case 'd': if (++i < argc) + process_purpose = string_copy_taint(argv[i], TRUE); + else badarg = TRUE; + break; + /* -MCG: set the queue name, to a non-default value */ - case 'G': if (++i < argc) queue_name = string_copy(argv[i]); + case 'G': if (++i < argc) queue_name = string_copy_taint(argv[i], TRUE); else badarg = TRUE; break; @@ -2795,11 +2788,14 @@ for (i = 1; i < argc; i++) Require three arguments for the proxied local address and port, and the TLS cipher. */ - case 't': if (++i < argc) sending_ip_address = argv[i]; + case 't': if (++i < argc) + sending_ip_address = string_copy_taint(argv[i], TRUE); else badarg = TRUE; - if (++i < argc) sending_port = (int)(Uatol(argv[i])); + if (++i < argc) + sending_port = (int)(Uatol(argv[i])); else badarg = TRUE; - if (++i < argc) continue_proxy_cipher = argv[i]; + if (++i < argc) + continue_proxy_cipher = string_copy_taint(argv[i], TRUE); else badarg = TRUE; /*FALLTHROUGH*/ @@ -2836,7 +2832,7 @@ for (i = 1; i < argc; i++) -Mvl show log */ - else if (*argrest == 0) + else if (!*argrest) { msg_action = MSG_DELIVER; forced_delivery = f.deliver_force_thaw = TRUE; @@ -2861,7 +2857,7 @@ for (i = 1; i < argc; i++) else if (Ustrcmp(argrest, "G") == 0) { msg_action = MSG_SETQUEUE; - queue_name_dest = argv[++i]; + queue_name_dest = string_copy_taint(argv[++i], TRUE); } else if (Ustrcmp(argrest, "mad") == 0) { @@ -2934,7 +2930,7 @@ for (i = 1; i < argc; i++) for sendmail it askes for "me too". Exim always does this. */ case 'm': - if (*argrest != 0) badarg = TRUE; + if (*argrest) badarg = TRUE; break; @@ -2942,7 +2938,7 @@ for (i = 1; i < argc; i++) their thing. It implies debugging at the D_v level. */ case 'N': - if (*argrest == 0) + if (!*argrest) { f.dont_deliver = TRUE; debug_selector |= D_v; @@ -2965,7 +2961,7 @@ for (i = 1; i < argc; i++) -O option=value and -Ooption=value. */ case 'O': - if (*argrest == 0) + if (!*argrest) if (++i >= argc) exim_fail("exim: string expected after -O\n"); break; @@ -3073,12 +3069,13 @@ for (i = 1; i < argc; i++) /* -oMa: Set sender host address */ - if (Ustrcmp(argrest, "a") == 0) sender_host_address = argv[++i]; + if (Ustrcmp(argrest, "a") == 0) + sender_host_address = string_copy_taint(argv[++i], TRUE); /* -oMaa: Set authenticator name */ else if (Ustrcmp(argrest, "aa") == 0) - sender_host_authenticated = argv[++i]; + sender_host_authenticated = string_copy_taint(argv[++i], TRUE); /* -oMas: setting authenticated sender */ @@ -3092,7 +3089,8 @@ for (i = 1; i < argc; i++) /* -oMi: Set incoming interface address */ - else if (Ustrcmp(argrest, "i") == 0) interface_address = argv[++i]; + else if (Ustrcmp(argrest, "i") == 0) + interface_address = string_copy_taint(argv[++i], TRUE); /* -oMm: Message reference */ @@ -3112,7 +3110,7 @@ for (i = 1; i < argc; i++) if (received_protocol) exim_fail("received_protocol is set already\n"); else - received_protocol = argv[++i]; + received_protocol = string_copy_taint(argv[++i], TRUE); /* -oMs: Set sender host name */ @@ -3124,7 +3122,7 @@ for (i = 1; i < argc; i++) else if (Ustrcmp(argrest, "t") == 0) { sender_ident_set = TRUE; - sender_ident = argv[++i]; + sender_ident = string_copy_taint(argv[++i], TRUE); } /* Else a bad argument */ @@ -3177,7 +3175,7 @@ for (i = 1; i < argc; i++) case 'X': if (*argrest) badarg = TRUE; - else override_local_interfaces = argv[++i]; + else override_local_interfaces = string_copy_taint(argv[++i], TRUE); break; /* Unknown -o argument */ @@ -3207,13 +3205,10 @@ for (i = 1; i < argc; i++) /* -panythingelse is taken as the Sendmail-compatible argument -prval:sval, which sets the host protocol and host name */ - if (*argrest == 0) - if (i+1 < argc) - argrest = argv[++i]; - else - { badarg = TRUE; break; } + if (!*argrest) + if (i+1 < argc) argrest = argv[++i]; else { badarg = TRUE; break; } - if (*argrest != 0) + if (*argrest) { uschar *hn; @@ -3221,15 +3216,15 @@ for (i = 1; i < argc; i++) exim_fail("received_protocol is set already\n"); hn = Ustrchr(argrest, ':'); - if (hn == NULL) - received_protocol = argrest; + if (!hn) + received_protocol = string_copy_taint(argrest, TRUE); else { int old_pool = store_pool; store_pool = POOL_PERM; - received_protocol = string_copyn(argrest, hn - argrest); + received_protocol = string_copyn_taint(argrest, hn - argrest, TRUE); store_pool = old_pool; - sender_host_name = hn + 1; + sender_host_name = string_copy_taint(hn + 1, TRUE); } } break; @@ -3292,14 +3287,14 @@ for (i = 1; i < argc; i++) only, optionally named, optionally starting from a given message id. */ if (!(list_queue || count_queue)) - if (*argrest == 0 + if ( !*argrest && (i + 1 >= argc || argv[i+1][0] == '-' || mac_ismsgid(argv[i+1]))) { queue_interval = 0; if (i+1 < argc && mac_ismsgid(argv[i+1])) - start_queue_run_id = argv[++i]; + start_queue_run_id = string_copy_taint(argv[++i], TRUE); if (i+1 < argc && mac_ismsgid(argv[i+1])) - stop_queue_run_id = argv[++i]; + stop_queue_run_id = string_copy_taint(argv[++i], TRUE); } /* -q[f][f][l][G/]: Run the queue at regular intervals, optionally @@ -3323,7 +3318,7 @@ for (i = 1; i < argc; i++) in all cases provided there are no further characters in this argument. */ - if (*argrest != 0) + if (*argrest) for (int i = 0; i < nelem(rsopts); i++) if (Ustrcmp(argrest, rsopts[i]) == 0) { @@ -3337,9 +3332,9 @@ for (i = 1; i < argc; i++) pick out particular messages. */ if (*argrest) - deliver_selectstring = argrest; + deliver_selectstring = string_copy_taint(argrest, TRUE); else if (i+1 < argc) - deliver_selectstring = argv[++i]; + deliver_selectstring = string_copy_taint(argv[++i], TRUE); else exim_fail("exim: string expected after -R\n"); break; @@ -3376,9 +3371,9 @@ for (i = 1; i < argc; i++) pick out particular messages. */ if (*argrest) - deliver_selectstring_sender = argrest; + deliver_selectstring_sender = string_copy_taint(argrest, TRUE); else if (i+1 < argc) - deliver_selectstring_sender = argv[++i]; + deliver_selectstring_sender = string_copy_taint(argv[++i], TRUE); else exim_fail("exim: string expected after -S\n"); break; @@ -3390,7 +3385,7 @@ for (i = 1; i < argc; i++) case 'T': if (f.running_in_test_harness && Ustrcmp(argrest, "qt") == 0) - fudged_queue_times = argv[++i]; + fudged_queue_times = string_copy_taint(argv[++i], TRUE); else badarg = TRUE; break; @@ -3398,7 +3393,7 @@ for (i = 1; i < argc; i++) /* -t: Set flag to extract recipients from body of message. */ case 't': - if (*argrest == 0) extract_recipients = TRUE; + if (!*argrest) extract_recipients = TRUE; /* -ti: Set flag to extract recipients from body of message, and also specify that dot does not end the message. */ @@ -3430,7 +3425,7 @@ for (i = 1; i < argc; i++) /* -v: verify things - this is a very low-level debugging */ case 'v': - if (*argrest == 0) + if (!*argrest) { debug_selector |= D_v; debug_file = stderr; @@ -3450,22 +3445,22 @@ for (i = 1; i < argc; i++) As Exim is 8-bit clean, it just ignores this flag. */ case 'x': - if (*argrest != 0) badarg = TRUE; + if (*argrest) badarg = TRUE; break; /* -X: in sendmail: takes one parameter, logfile, and sends debugging logs to that file. We swallow the parameter and otherwise ignore it. */ case 'X': - if (*argrest == '\0') + if (!*argrest) if (++i >= argc) exim_fail("exim: string expected after -X\n"); break; case 'z': - if (*argrest == '\0') + if (!*argrest) if (++i < argc) - log_oneline = argv[i]; + log_oneline = string_copy_taint(argv[i], TRUE); else exim_fail("exim: file name expected after %s\n", argv[i-1]); break; @@ -4075,11 +4070,12 @@ if ( (debug_selector & D_any || LOGGING(arguments)) p = big_buffer + 3; } printing = string_printing(argv[i]); - if (printing[0] == 0) quote = US"\""; else + if (!*printing) quote = US"\""; + else { const uschar *pp = printing; quote = US""; - while (*pp != 0) if (isspace(*pp++)) { quote = US"\""; break; } + while (*pp) if (isspace(*pp++)) { quote = US"\""; break; } } p += sprintf(CS p, " %s%.*s%s", quote, (int)(big_buffer_size - (p - big_buffer) - 4), printing, quote); @@ -4115,19 +4111,19 @@ script. */ if (bi_option) { (void)fclose(config_file); - if (bi_command != NULL) + if (bi_command) { int i = 0; uschar *argv[3]; argv[i++] = bi_command; - if (alias_arg != NULL) argv[i++] = alias_arg; + if (alias_arg) argv[i++] = alias_arg; argv[i++] = NULL; setgroups(group_count, group_list); exim_setugid(real_uid, real_gid, FALSE, US"running bi_command"); DEBUG(D_exec) debug_printf("exec %.256s %.256s\n", argv[0], - (argv[1] == NULL)? US"" : argv[1]); + argv[1] ? argv[1] : US""); execv(CS argv[0], (char *const *)argv); exim_fail("exim: exec failed: %s\n", strerror(errno)); @@ -4433,7 +4429,7 @@ if (test_retry_arg >= 0) if (test_retry_arg >= argc) { printf("-brt needs a domain or address argument\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } s1 = argv[test_retry_arg++]; s2 = NULL; @@ -4538,7 +4534,7 @@ if (test_retry_arg >= 0) printf("\n"); } - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } /* Handle a request to list one or more configuration options */ @@ -4565,14 +4561,14 @@ if (list_options) else fail = !readconf_print(argv[i], NULL, flag_n); } - exim_exit(fail ? EXIT_FAILURE : EXIT_SUCCESS, US"main"); + exim_exit(fail ? EXIT_FAILURE : EXIT_SUCCESS); } if (list_config) { set_process_info("listing config"); exim_exit(readconf_print(US"config", NULL, flag_n) - ? EXIT_SUCCESS : EXIT_FAILURE, US"main"); + ? EXIT_SUCCESS : EXIT_FAILURE); } @@ -4598,7 +4594,7 @@ if (msg_action_arg > 0 && msg_action != MSG_LOAD) if (prod_requires_admin && !f.admin_user) { fprintf(stderr, "exim: Permission denied\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } set_process_info("delivering specified messages"); if (deliver_give_up) forced_delivery = f.deliver_force_thaw = TRUE; @@ -4606,22 +4602,24 @@ if (msg_action_arg > 0 && msg_action != MSG_LOAD) { int status; pid_t pid; + /*XXX This use of argv[i] for msg_id should really be tainted, but doing + that runs into a later copy into the untainted global message_id[] */ if (i == argc - 1) (void)deliver_message(argv[i], forced_delivery, deliver_give_up); - else if ((pid = fork()) == 0) + else if ((pid = exim_fork(US"cmdline-delivery")) == 0) { (void)deliver_message(argv[i], forced_delivery, deliver_give_up); - exim_underbar_exit(EXIT_SUCCESS, US"cmdline-delivery"); + exim_underbar_exit(EXIT_SUCCESS); } else if (pid < 0) { fprintf(stderr, "failed to fork delivery process for %s: %s\n", argv[i], strerror(errno)); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } else wait(&status); } - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } @@ -4640,7 +4638,7 @@ if (queue_interval == 0 && !f.daemon_listen) else set_process_info("running the queue (single queue run)"); queue_run(start_queue_run_id, stop_queue_run_id, FALSE); - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } @@ -4810,10 +4808,10 @@ if (test_rewrite_arg >= 0) if (test_rewrite_arg >= argc) { printf("-brw needs an address argument\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } rewrite_test(argv[test_rewrite_arg]); - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } /* A locally-supplied message is considered to be coming from a local user @@ -4928,7 +4926,7 @@ if (verify_address_mode || f.address_test_mode) } route_tidyup(); - exim_exit(exit_value, US"main"); + exim_exit(exit_value); } /* Handle expansion checking. Either expand items on the command line, or read @@ -5014,7 +5012,7 @@ if (expansion_test) deliver_datafile = -1; } - exim_exit(EXIT_SUCCESS, US"main: expansion test"); + exim_exit(EXIT_SUCCESS); } @@ -5108,7 +5106,7 @@ if (host_checking) } smtp_log_no_mail(); } - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } @@ -5271,7 +5269,7 @@ if (smtp_input) if (!smtp_start_session()) { mac_smtp_fflush(); - exim_exit(EXIT_SUCCESS, US"smtp_start toplevel"); + exim_exit(EXIT_SUCCESS); } } @@ -5386,14 +5384,14 @@ while (more) cancel_cutthrough_connection(TRUE, US"receive dropped"); if (more) goto moreloop; smtp_log_no_mail(); /* Log no mail if configured */ - exim_exit(EXIT_FAILURE, US"receive toplevel"); + exim_exit(EXIT_FAILURE); } } else { cancel_cutthrough_connection(TRUE, US"message setup dropped"); smtp_log_no_mail(); /* Log no mail if configured */ - exim_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS, US"msg setup toplevel"); + exim_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS); } } @@ -5443,7 +5441,7 @@ while (more) if (error_handling == ERRORS_STDERR) { fprintf(stderr, "exim: too many recipients\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } else return @@ -5471,13 +5469,12 @@ while (more) errmess = US"unqualified recipient address not allowed"; } - if (recipient == NULL) - { + if (!recipient) if (error_handling == ERRORS_STDERR) { fprintf(stderr, "exim: bad recipient address \"%s\": %s\n", string_printing(list[i]), errmess); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } else { @@ -5489,7 +5486,6 @@ while (more) moan_to_sender(ERRMESS_BADARGADDRESS, &eblock, NULL, stdin, TRUE)? errors_sender_rc : EXIT_FAILURE; } - } receive_add_recipient(string_copy_taint(recipient, TRUE), -1); s = ss; @@ -5502,8 +5498,8 @@ while (more) DEBUG(D_receive) { - if (sender_address != NULL) debug_printf("Sender: %s\n", sender_address); - if (recipients_list != NULL) + if (sender_address) debug_printf("Sender: %s\n", sender_address); + if (recipients_list) { debug_printf("Recipients:\n"); for (int i = 0; i < recipients_count; i++) @@ -5549,7 +5545,7 @@ while (more) for real; when reading the headers of a message for filter testing, it is TRUE if the headers were terminated by '.' and FALSE otherwise. */ - if (message_id[0] == 0) exim_exit(EXIT_FAILURE, US"main"); + if (message_id[0] == 0) exim_exit(EXIT_FAILURE); } /* Non-SMTP message reception */ /* If this is a filter testing run, there are headers in store, but @@ -5594,7 +5590,7 @@ while (more) if (chdir("/")) /* Get away from wherever the user is running this from */ { DEBUG(D_receive) debug_printf("chdir(\"/\") failed\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } /* Now we run either a system filter test, or a user filter test, or both. @@ -5604,15 +5600,15 @@ while (more) if ((filter_test & FTEST_SYSTEM) != 0) if (!filter_runtest(filter_sfd, filter_test_sfile, TRUE, more)) - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); memcpy(filter_sn, filter_n, sizeof(filter_sn)); if ((filter_test & FTEST_USER) != 0) if (!filter_runtest(filter_ufd, filter_test_ufile, FALSE, more)) - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } /* Else act on the result of message reception. We should not get here unless @@ -5694,7 +5690,7 @@ while (more) pid_t pid; search_tidyup(); - if ((pid = fork()) == 0) + if ((pid = exim_fork(US"local-accept-delivery")) == 0) { int rc; close_unwanted(); /* Close unwanted file descriptors and TLS */ @@ -5714,7 +5710,7 @@ while (more) rc = deliver_message(message_id, FALSE, FALSE); search_tidyup(); exim_underbar_exit(!mua_wrapper || rc == DELIVER_MUA_SUCCEEDED - ? EXIT_SUCCESS : EXIT_FAILURE, US"cmdline-delivery"); + ? EXIT_SUCCESS : EXIT_FAILURE); } if (pid < 0) @@ -5738,7 +5734,7 @@ while (more) log_write(0, LOG_MAIN|LOG_PANIC, "process %d crashed with signal %d while delivering %s", (int)pid, status & 0x00ff, message_id); - if (mua_wrapper && (status & 0xffff) != 0) exim_exit(EXIT_FAILURE, US"main"); + if (mua_wrapper && (status & 0xffff) != 0) exim_exit(EXIT_FAILURE); } } } @@ -5770,7 +5766,7 @@ moreloop: store_reset(reset_point); } -exim_exit(EXIT_SUCCESS, US"main"); /* Never returns */ +exim_exit(EXIT_SUCCESS); /* Never returns */ return 0; /* To stop compiler warning */ }