X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/54cdb463ab15d0a064cfe0a276b3e3974767c8c7..2fe1a124e7e7f496b39d9f348403dd5d5e69f01f:/src/src/receive.c diff --git a/src/src/receive.c b/src/src/receive.c index 325544643..75447499b 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/receive.c,v 1.13 2005/04/04 10:33:49 ph10 Exp $ */ +/* $Cambridge: exim/src/src/receive.c,v 1.23 2005/09/07 10:15:33 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -303,8 +303,8 @@ if (spool_name[0] != 0) /* Now close the file if it is open, either as a fd or a stream. */ -if (data_file != NULL) fclose(data_file); - else if (data_fd >= 0) close(data_fd); +if (data_file != NULL) (void)fclose(data_file); + else if (data_fd >= 0) (void)close(data_fd); /* Attempt to close down an SMTP connection tidily. */ @@ -351,8 +351,9 @@ if (smtp_input) msg = US"SMTP incoming data timeout"; log_write(L_lost_incoming_connection, LOG_MAIN, "SMTP data timeout (message abandoned) on connection " - "from %s", - (sender_fullhost != NULL)? sender_fullhost : US"local process"); + "from %s F=<%s>", + (sender_fullhost != NULL)? sender_fullhost : US"local process", + sender_address); } else { @@ -864,7 +865,7 @@ if (error_handling == ERRORS_SENDER) error_rc = EXIT_FAILURE; } else fprintf(stderr, "exim: %s%s\n", text2, text1); /* Sic */ -fclose(f); +(void)fclose(f); exim_exit(error_rc); } @@ -1007,6 +1008,7 @@ return s; +#ifdef WITH_CONTENT_SCAN /************************************************* * Run the MIME ACL on a message * @@ -1076,7 +1078,7 @@ mime_is_rfc822 = 0; MIME_ACL_CHECK: mime_part_count = -1; rc = mime_acl_check(acl, mbox_file, NULL, &user_msg, &log_msg); -fclose(mbox_file); +(void)fclose(mbox_file); if (Ustrlen(rfc822_file_path) > 0) { mime_part_count = mime_part_count_buffer; @@ -1095,7 +1097,8 @@ if (rc == OK) { struct dirent *entry; DIR *tempdir; - snprintf(CS temp_path, 1024, "%s/scan/%s", spool_directory, message_id); + (void)string_format(temp_path, 1024, "%s/scan/%s", spool_directory, + message_id); tempdir = opendir(CS temp_path); n = 0; @@ -1103,7 +1106,7 @@ if (rc == OK) { entry = readdir(tempdir); if (entry == NULL) break; if (strncmpic(US entry->d_name,US"__rfc822_",9) == 0) { - snprintf(CS rfc822_file_path, 2048,"%s/scan/%s/%s", spool_directory, message_id, entry->d_name); + (void)string_format(rfc822_file_path, 2048,"%s/scan/%s/%s", spool_directory, message_id, entry->d_name); debug_printf("RFC822 attachment detected: running MIME ACL for '%s'\n", rfc822_file_path); break; }; @@ -1111,7 +1114,7 @@ if (rc == OK) { closedir(tempdir); if (entry != NULL) { - mbox_file = Ufopen(rfc822_file_path,"r"); + mbox_file = Ufopen(rfc822_file_path,"rb"); if (mbox_file == NULL) { log_write(0, LOG_PANIC, "acl_smtp_mime: can't open RFC822 spool file, skipping."); @@ -1146,6 +1149,7 @@ else if (rc != OK) return TRUE; } +#endif /* WITH_CONTENT_SCAN */ /************************************************* @@ -1336,11 +1340,9 @@ received_count = 1; /* For the one we will add */ if (thismessage_size_limit <= 0) thismessage_size_limit = INT_MAX; -/* While reading the message, body_linecount and body_zerocount is computed. -The full message_ linecount is set up only when the headers are read back in -from the spool for delivery. */ +/* While reading the message, the following counts are computed. */ -body_linecount = body_zerocount = 0; +message_linecount = body_linecount = body_zerocount = 0; #ifdef EXPERIMENTAL_DOMAINKEYS /* Call into DK to set up the context. Check if DK is to be run are carried out @@ -1570,7 +1572,11 @@ for (;;) /* End of header line reached */ EOL: - receive_linecount++; /* For BSMTP errors */ + + /* Keep track of lines for BSMTP errors and overall message_linecount. */ + + receive_linecount++; + message_linecount++; /* Now put in the terminating newline. There is always space for at least two more characters. */ @@ -2332,35 +2338,62 @@ Sender: if it is required. */ if (from_header == NULL && (sender_host_address == NULL || submission_mode)) { + uschar *oname = US""; + + /* Use the originator_name if this is a locally submitted message and the + caller is not trusted. For trusted callers, use it only if -F was used to + force its value or if we have a non-SMTP message for which -f was not used + to set the sender. */ + + if (sender_host_address == NULL) + { + if (!trusted_caller || sender_name_forced || + (!smtp_input && !sender_address_forced)) + oname = originator_name; + } + + /* For non-locally submitted messages, the only time we use the originator + name is when it was forced by the /name= option on control=submission. */ + + else + { + if (submission_name != NULL) oname = submission_name; + } + /* Envelope sender is empty */ if (sender_address[0] == 0) { + uschar *fromstart, *fromend; + + fromstart = string_sprintf("%sFrom: %s%s", resent_prefix, + oname, (oname[0] == 0)? "" : " <"); + fromend = (oname[0] == 0)? US"" : US">"; + if (sender_local || local_error_message) { - header_add(htype_from, "%sFrom: %s%s%s@%s%s\n", resent_prefix, - originator_name, - (originator_name[0] == 0)? "" : " <", - local_part_quote(originator_login), - qualify_domain_sender, - (originator_name[0] == 0)? "" : ">"); + header_add(htype_from, "%s%s@%s%s\n", fromstart, + local_part_quote(originator_login), qualify_domain_sender, + fromend); } else if (submission_mode && authenticated_id != NULL) { if (submission_domain == NULL) { - header_add(htype_from, "%sFrom: %s@%s\n", resent_prefix, - local_part_quote(authenticated_id), qualify_domain_sender); + header_add(htype_from, "%s%s@%s%s\n", fromstart, + local_part_quote(authenticated_id), qualify_domain_sender, + fromend); } else if (submission_domain[0] == 0) /* empty => whole address set */ { - header_add(htype_from, "%sFrom: %s\n", resent_prefix, - authenticated_id); + header_add(htype_from, "%s%s%s\n", fromstart, authenticated_id, + fromend); } else { - header_add(htype_from, "%sFrom: %s@%s\n", resent_prefix, - local_part_quote(authenticated_id), submission_domain); + header_add(htype_from, "%s%s@%s%s\n", fromstart, + local_part_quote(authenticated_id), submission_domain, + fromend); } from_header = header_last; /* To get it checked for Sender: */ } @@ -2372,15 +2405,12 @@ if (from_header == NULL && (sender_host_address == NULL || submission_mode)) else { - if (!smtp_input || sender_local) - header_add(htype_from, "%sFrom: %s%s%s%s\n", - resent_prefix, originator_name, - (originator_name[0] == 0)? "" : " <", - (sender_address_unrewritten == NULL)? - sender_address : sender_address_unrewritten, - (originator_name[0] == 0)? "" : ">"); - else - header_add(htype_from, "%sFrom: %s\n", resent_prefix, sender_address); + header_add(htype_from, "%sFrom: %s%s%s%s\n", resent_prefix, + oname, + (oname[0] == 0)? "" : " <", + (sender_address_unrewritten == NULL)? + sender_address : sender_address_unrewritten, + (oname[0] == 0)? "" : ">"); from_header = header_last; /* To get it checked for Sender: */ } @@ -2461,12 +2491,27 @@ if (from_header != NULL && if (make_sender) { - if (submission_mode) + if (submission_mode && submission_name == NULL) header_add(htype_sender, "%sSender: %s\n", resent_prefix, generated_sender_address); else header_add(htype_sender, "%sSender: %s <%s>\n", - resent_prefix, originator_name, generated_sender_address); + resent_prefix, + submission_mode? submission_name : originator_name, + generated_sender_address); + } + + /* Ensure that a non-null envelope sender address corresponds to the + submission mode sender address. */ + + if (submission_mode && sender_address[0] != 0) + { + if (sender_address_unrewritten == NULL) + sender_address_unrewritten = sender_address; + sender_address = generated_sender_address; + log_write(L_address_rewrite, LOG_MAIN, + "\"%s\" from env-from rewritten as \"%s\" by submission mode", + sender_address_unrewritten, generated_sender_address); } } @@ -2582,8 +2627,8 @@ if (data_fd < 0) /* Make sure the file's group is the Exim gid, and double-check the mode because the group setting doesn't always get set automatically. */ -fchown(data_fd, exim_uid, exim_gid); -fchmod(data_fd, SPOOL_MODE); +(void)fchown(data_fd, exim_uid, exim_gid); +(void)fchmod(data_fd, SPOOL_MODE); /* We now have data file open. Build a stream for it and lock it. We lock only the first line of the file (containing the message ID) because otherwise there @@ -2612,7 +2657,7 @@ if (next != NULL) { uschar *s = next->text; int len = next->slen; - fwrite(s, 1, len, data_file); + (void)fwrite(s, 1, len, data_file); body_linecount++; /* Assumes only 1 line */ } @@ -2630,6 +2675,7 @@ if (!ferror(data_file) && !(receive_feof)() && message_ended != END_DOT) else message_ended = read_message_data(data_file); receive_linecount += body_linecount; /* For BSMTP errors mainly */ + message_linecount += body_linecount; /* Handle premature termination of SMTP */ @@ -2802,7 +2848,7 @@ if (extract_recip && (bad_addresses != NULL || recipients_count == 0)) if (recipients_count == 0 || error_handling == ERRORS_STDERR) { Uunlink(spool_name); - fclose(data_file); + (void)fclose(data_file); exim_exit(error_rc); } } @@ -3388,7 +3434,7 @@ if (message_logs && blackholed_by == NULL) { log_write(0, LOG_MAIN|LOG_PANIC, "Couldn't fdopen message log %s: %s", spool_name, strerror(errno)); - close(fd); + (void)close(fd); } else { @@ -3398,7 +3444,7 @@ if (message_logs && blackholed_by == NULL) frozen_by); if (queue_only_policy) fprintf(message_log, "%s no immediate delivery: queued by %s\n", now, queued_by); - fclose(message_log); + (void)fclose(message_log); } } } @@ -3430,8 +3476,8 @@ possible for fclose() to fail - but what to do? What has happened to the lock if this happens? */ TIDYUP: -process_info[process_info_len] = 0; /* Remove message id */ -if (data_file != NULL) fclose(data_file); /* Frees the lock */ +process_info[process_info_len] = 0; /* Remove message id */ +if (data_file != NULL) (void)fclose(data_file); /* Frees the lock */ /* Now reset signal handlers to their defaults */ @@ -3456,8 +3502,9 @@ if (smtp_input) { if (smtp_reply == NULL) { - if (fake_reject) - smtp_respond(550,TRUE,fake_reject_text); + if (fake_response != OK) + smtp_respond(fake_response == DEFER ? 450 : 550, + TRUE, fake_response_text); else smtp_printf("250 OK id=%s\r\n", message_id); if (host_checking) @@ -3466,8 +3513,9 @@ if (smtp_input) } else if (smtp_reply[0] != 0) { - if (fake_reject && (smtp_reply[0] == '2')) - smtp_respond(550,TRUE,fake_reject_text); + if (fake_response != OK && (smtp_reply[0] == '2')) + smtp_respond(fake_response == DEFER ? 450 : 550, + TRUE, fake_response_text); else smtp_printf("%.1024s\r\n", smtp_reply); }