From: Philip Hazel Date: Tue, 19 Oct 2004 11:40:52 +0000 (+0000) Subject: Add missing search cache tidyup before delivering message received via X-Git-Tag: exim-4_50~129 X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=commitdiff_plain;h=eb2c02484772e04f92ec95769011ce2e6ad55bc2;hp=5be20824c59ec2a16692d5ccfaf8c9bfcecbc6a3 Add missing search cache tidyup before delivering message received via the command line (could cause crashes if certain lookups were done during message reception). --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index c2f94711f..c959e63b8 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.11 2004/10/19 11:29:25 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.12 2004/10/19 11:40:52 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- @@ -42,6 +42,11 @@ Exim version 4.44 10. $recipients is now available in the predata ACL (oversight). +11. Tidy the search cache before the fork to do a delivery from a message + received from the command line. Otherwise the child will trigger a lookup + failure and thereby defer the delivery if it tries to use (for example) a + cached ldap connection that the parent has called unbind on. + Exim version 4.43 ----------------- diff --git a/src/ACKNOWLEDGMENTS b/src/ACKNOWLEDGMENTS index f58b5ce0b..53b9a8025 100644 --- a/src/ACKNOWLEDGMENTS +++ b/src/ACKNOWLEDGMENTS @@ -1,4 +1,4 @@ -$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.1 2004/10/06 11:36:51 ph10 Exp $ +$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.2 2004/10/19 11:40:52 ph10 Exp $ EXIM ACKNOWLEDGEMENTS @@ -20,7 +20,7 @@ relatively small patches. Philip Hazel Lists created: 20 November 2002 -Last updated: 04 October 2004 +Last updated: 19 October 2004 THE OLD LIST @@ -189,6 +189,7 @@ William Thompson Suggested patch for acl_smtp_helo Suggested patch for continuation lines in file ACLs Patch for != support in DNS lists Adam Thornton Patch for SMTP port expansion +Rein Tollevik Patch to fix search cache missing tidyup Stefan Traby Threaded Perl support Samuli Tuomola OS files for QNX 6.2.0 Dave Turner Suggested patch for sender rewriting brokenness diff --git a/src/src/exim.c b/src/src/exim.c index c8d1917a4..8f51e66fa 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/exim.c,v 1.5 2004/10/19 11:04:26 ph10 Exp $ */ +/* $Cambridge: exim/src/src/exim.c,v 1.6 2004/10/19 11:40:52 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -196,9 +196,9 @@ os_non_restarting_signal(SIGALRM, sigalrm_handler); /* This function is called by millisleep() and exim_wait_tick() to wait for a period of time that may include a fraction of a second. The coding is somewhat -tedious. We do not expect setitimer() ever to fail, but if it does, the process -will wait for ever, so we panic in this instance. (There was a case of this -when a bug in a function that calls milliwait() caused it to pass invalid data. +tedious. We do not expect setitimer() ever to fail, but if it does, the process +will wait for ever, so we panic in this instance. (There was a case of this +when a bug in a function that calls milliwait() caused it to pass invalid data. That's when I added the check. :-) Argument: an itimerval structure containing the interval @@ -214,8 +214,8 @@ sigset_t old_sigmask; (void)sigaddset(&sigmask, SIGALRM); /* Add SIGALRM */ (void)sigprocmask(SIG_BLOCK, &sigmask, &old_sigmask); /* Block SIGALRM */ if (setitimer(ITIMER_REAL, itval, NULL) < 0) /* Start timer */ - log_write(0, LOG_MAIN|LOG_PANIC_DIE, - "setitimer() failed: %s", strerror(errno)); + log_write(0, LOG_MAIN|LOG_PANIC_DIE, + "setitimer() failed: %s", strerror(errno)); (void)sigfillset(&sigmask); /* All signals */ (void)sigdelset(&sigmask, SIGALRM); /* Remove SIGALRM */ (void)sigsuspend(&sigmask); /* Until SIGALRM */ @@ -2837,21 +2837,21 @@ else strerror(errno)); rlp.rlim_cur = rlp.rlim_max = 0; } - - /* I originally chose 1000 as a nice big number that was unlikely to + + /* I originally chose 1000 as a nice big number that was unlikely to be exceeded. It turns out that some older OS have a fixed upper limit of 256. */ - + if (rlp.rlim_cur < 1000) { rlp.rlim_cur = rlp.rlim_max = 1000; if (setrlimit(RLIMIT_NOFILE, &rlp) < 0) - { + { rlp.rlim_cur = rlp.rlim_max = 256; if (setrlimit(RLIMIT_NOFILE, &rlp) < 0) log_write(0, LOG_MAIN|LOG_PANIC, "setrlimit(RLIMIT_NOFILE) failed: %s", strerror(errno)); - } + } } #endif @@ -4393,11 +4393,11 @@ while (more) int rcount = 0; int count = argc - recipients_arg; uschar **list = argv + recipients_arg; - + /* These options cannot be changed dynamically for non-SMTP messages */ - + active_local_sender_retain = local_sender_retain; - active_local_from_check = local_from_check; + active_local_from_check = local_from_check; /* Save before any rewriting */ @@ -4602,11 +4602,16 @@ while (more) /* Else do the delivery unless the ACL or local_scan() called for queue only or froze the message. Always deliver in a separate process. A fork failure is not a disaster, as the delivery will eventually happen on a subsequent queue - run. */ + run. The search cache must be tidied before the fork, as the parent will + do it before exiting. The child will trigger a lookup failure and + thereby defer the delivery if it tries to use (for example) a cached ldap + connection that the parent has called unbind on. */ else if (!queue_only_policy && !deliver_freeze) { pid_t pid; + search_tidyup(); + if ((pid = fork()) == 0) { int rc;