1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-02-05 11:35:01 +00:00

mail/exim*: update to 4.98 release (+)

Reported by:	VVD (via IRC)
This commit is contained in:
Dima Panov 2024-07-15 13:51:07 +03:00
parent 469c3748a9
commit a509d8ed3c
No known key found for this signature in database
GPG Key ID: FB8BA09DD5398F29
8 changed files with 13 additions and 303 deletions

View File

@ -1,5 +1,5 @@
PORTNAME= exim
PORTVERSION= 4.97.1
PORTVERSION= 4.98
CATEGORIES= mail
MASTER_SITES= EXIM
MASTER_SITE_SUBDIR= /exim4/ \

View File

@ -1,7 +1,7 @@
TIMESTAMP = 1704499920
SHA256 (exim/exim-html-4.97.1.tar.bz2) = 9e2cc6b39f4480ee7f575946466d025331fc21368c873a8685b66fdb1919693c
SIZE (exim/exim-html-4.97.1.tar.bz2) = 647718
SHA256 (exim/exim-pdf-4.97.1.tar.bz2) = 9761ab9f6099bb865b9838ecf3d62008683cadd2ba2ae6fbb9640139044640ba
SIZE (exim/exim-pdf-4.97.1.tar.bz2) = 2176843
SHA256 (exim/exim-postscript-4.97.1.tar.bz2) = a01809e46d2c6283482788822445187299325d6e909611f6496d2e5ad1f1d14b
SIZE (exim/exim-postscript-4.97.1.tar.bz2) = 1144052
TIMESTAMP = 1721038337
SHA256 (exim/exim-html-4.98.tar.bz2) = 89a4f17a18461f7156d0f7779a292612a547cedb13e5eb10fc70b0973d0a1001
SIZE (exim/exim-html-4.98.tar.bz2) = 650008
SHA256 (exim/exim-pdf-4.98.tar.bz2) = 90def6b48a47d3dab0513dcb61b5a7c896eeca8f233b1d412d441b1067ca7e0d
SIZE (exim/exim-pdf-4.98.tar.bz2) = 2186363
SHA256 (exim/exim-postscript-4.98.tar.bz2) = 8d405ef9024d72255534c7ab7af3da98d5e1a83acbf528d97cbddfb014e24a5c
SIZE (exim/exim-postscript-4.98.tar.bz2) = 1150095

View File

@ -1,4 +1,3 @@
PORTREVISION= 1
PKGNAMESUFFIX= -ldap2
MASTERDIR= ${.CURDIR}/../exim

View File

@ -1,6 +1,6 @@
PORTNAME= exim
PORTVERSION?= ${EXIM_VERSION}
PORTREVISION?= 5
PORTREVISION?= 0
CATEGORIES= mail
MASTER_SITES= EXIM:exim
MASTER_SITE_SUBDIR= /exim4/:exim \
@ -109,7 +109,7 @@ EXTRA_PATCHES+= ${FILESDIR}/extra-patch-Local-sa-exim.c
EXTRA_PATCHES+= ${FILESDIR}/extra-patch-Local-sa-exim.conf
.endif
EXIM_VERSION= 4.97.1
EXIM_VERSION= 4.98
SA_EXIM_VERSION=4.2.1
EXIM_INSTALL_ARG+= "-no_chown" "-no_symlink"
EXTRA_PATCHES+= `${FIND} ${PATCHDIR} -name '74_*.patch'|${SORT} -h`

View File

@ -1,5 +1,5 @@
TIMESTAMP = 1704046714
SHA256 (exim/exim-4.97.1.tar.bz2) = 3a9614ac5b5d10dd98bfc7594561503a51a89c2ccbc52bca3153ee98af1cb37a
SIZE (exim/exim-4.97.1.tar.bz2) = 2071215
TIMESTAMP = 1721038320
SHA256 (exim/exim-4.98.tar.bz2) = acfd93f6e4a38e4887867614770ea062b2453ed93e355772adeae6c6598b0d92
SIZE (exim/exim-4.98.tar.bz2) = 2099901
SHA256 (exim/sa-exim-4.2.1.tar.gz) = 24d4bf7b0fdddaea11f132981cebb6a86a4ab20ef54111a8ebd481b421c6e2c1
SIZE (exim/sa-exim-4.2.1.tar.gz) = 68933

View File

@ -1,212 +0,0 @@
From ced0bbf43860a2e4ddc88e3ba20ae731324586c5 Mon Sep 17 00:00:00 2001
From: Jeremy Harris <jgh146exb@wizmail.org>
Date: Fri, 15 Dec 2023 21:05:32 +0000
Subject: [PATCH] Fix periodic queue runs. Bug 3046
Broken-by: 7d5055276a22
---
doc/ChangeLog | 5 ++++
src/daemon.c | 58 ++++++++++++++++++++++++++++---------------
src/structs.h | 2 +-
3 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 85064cc8d..c46f3b8c0 100644
--- doc/ChangeLog
+++ doc/ChangeLog
@@ -53,6 +53,11 @@ JH/10 Bug 3058: Ensure that a failing expansion in a router "set" option defers
the routing operation. Previously it would silently stop routing the
message.
+JH/11 Bug 3046: Fix queue-runs. Previously, the arrivel of a notification or
+ info-request event close in time to a scheduled run timer could result in
+ the latter being missed, and no further queue scheduled runs being
+ initiated. This ouwld be more likely on high-load systems.
+
Exim version 4.97
diff --git a/src/src/daemon.c b/src/src/daemon.c
index f2183c735..aff05120a 100644
--- src/daemon.c
+++ src/daemon.c
@@ -1258,10 +1258,9 @@ static const uschar * queuerun_msg_qname;
/* The notifier socket has something to read. Pull the message from it, decode
and do the action.
+*/
-Return TRUE if a sigalrm should be emulated */
-
-static BOOL
+static void
daemon_notification(void)
{
uschar buf[256], cbuf[256];
@@ -1277,8 +1276,8 @@ struct msghdr msg = { .msg_name = &sa_un,
ssize_t sz;
buf[sizeof(buf)-1] = 0;
-if ((sz = recvmsg(daemon_notifier_fd, &msg, 0)) <= 0) return FALSE;
-if (sz >= sizeof(buf)) return FALSE;
+if ((sz = recvmsg(daemon_notifier_fd, &msg, 0)) <= 0) return;
+if (sz >= sizeof(buf)) return;
#ifdef notdef
debug_printf("addrlen %d\n", msg.msg_namelen);
@@ -1351,7 +1350,7 @@ switch (buf[0])
: !buf[1+MESSAGE_ID_LENGTH+1]
)
{ queuerun_msg_qname = q->name; break; }
- return TRUE;
+ return;
#endif
case NOTIFY_QUEUE_SIZE_REQ:
@@ -1373,7 +1372,7 @@ switch (buf[0])
regex_at_daemon(buf);
break;
}
-return FALSE;
+return;
}
@@ -1432,7 +1431,7 @@ for (qrunner * q = qrunners, * next; q; q = next)
if (sorted)
{
qrunner ** p = &sorted;
- for (qrunner * qq; qq = *p; p = &(qq->next))
+ for (qrunner * qq; qq = *p; p = &qq->next)
if ( q->next_tick < qq->next_tick
|| q->next_tick == qq->next_tick && q->interval < qq->interval
)
@@ -1451,6 +1450,13 @@ qrunners = sorted;
return qrunners ? qrunners->next_tick - time(NULL) : 0;
}
+/* See if we can do a queue run. If policy limit permit, kick one off.
+If both notification and timer events are present, handle the former
+and leave the timer outstanding.
+
+Return the number of seconds until the next due runner.
+*/
+
static int
daemon_qrun(int local_queue_run_max, struct pollfd * fd_polls, int listen_socket_count)
{
@@ -1464,13 +1470,16 @@ DEBUG(D_any) debug_printf("%s received\n",
enough queue runners on the go. If we are not running as root, a re-exec is
required. In the calling process, restart the alamr timer for the next run. */
-if (is_multiple_qrun())
+if (is_multiple_qrun()) /* we are managing periodic runs */
if (local_queue_run_max <= 0 || queue_run_count < local_queue_run_max)
{
qrunner * q = NULL;
#ifndef DISABLE_QUEUE_RAMP
- if (*queuerun_msgid) /* See if we can start another runner for this queue */
+ /* If this is a triggered run for a specific message, see if we can start
+ another runner for this queue. */
+
+ if (*queuerun_msgid)
{
for (qrunner * qq = qrunners; qq; qq = qq->next)
if (qq->name == queuerun_msg_qname)
@@ -1481,13 +1490,13 @@ if (is_multiple_qrun())
}
else
#endif
- /* In order of run priority, find the first queue for which we can start
- a runner */
+ /* Normal periodic runL in order of run priority, find the first queue
+ for which we can start a runner */
for (q = qrunners; q; q = q->next)
if (q->run_count < q->run_max) break;
- if (q)
+ if (q) /* found a queue to run */
{
pid_t pid;
@@ -1619,19 +1628,23 @@ if (is_multiple_qrun())
}
}
-sigalrm_seen = FALSE;
+/* The queue run has been initiated (unless we were already running enough) */
+
#ifndef DISABLE_QUEUE_RAMP
-if (*queuerun_msgid) /* it was a fast-ramp kick */
+if (*queuerun_msgid) /* it was a fast-ramp kick; dealt with */
*queuerun_msgid = 0;
else /* periodic or one-time queue run */
#endif
- { /* Impose a minimum 1s tick, even when a run was outstanding */
+ /* Set up next timer callback. Impose a minimum 1s tick,
+ even when a run was outstanding */
+ {
int interval = next_qrunner_interval();
if (interval <= 0) interval = 1;
+ sigalrm_seen = FALSE;
if (qrunners) /* there are still periodic qrunners */
{
- ALARM(interval);
+ ALARM(interval); /* set up next qrun tick */
return interval;
}
}
@@ -2612,7 +2625,7 @@ for (;;)
The other option is that we have an inetd wait timeout specified to -bw. */
- if (sigalrm_seen)
+ if (sigalrm_seen || *queuerun_msgid)
if (inetd_wait_timeout > 0)
daemon_inetd_wtimeout(last_connection_time); /* Might not return */
else
@@ -2641,7 +2654,9 @@ for (;;)
select() was interrupted so that we reap the child. This might still leave
a small window when a SIGCHLD could get lost. However, since we use SIGCHLD
only to do the reaping more quickly, it shouldn't result in anything other
- than a delay until something else causes a wake-up. */
+ than a delay until something else causes a wake-up.
+ For the normal case, wait for either a pollable fd (eg. new connection) or
+ or a SIGALRM (for a periodic queue run) */
if (sigchld_seen)
{
@@ -2706,10 +2721,13 @@ for (;;)
break; /* to top of daemon loop */
}
#endif
+ /* Handle the daemon-notifier socket. If it was a fast-ramp
+ notification then queuerun_msgid will have a nonzerolength string. */
+
if (dnotify_poll && dnotify_poll->revents & POLLIN)
{
dnotify_poll->revents = 0;
- sigalrm_seen = daemon_notification();
+ daemon_notification();
break; /* to top of daemon loop */
}
for (struct pollfd * p = fd_polls; p < fd_polls + listen_socket_count;
diff --git a/src/src/structs.h b/src/src/structs.h
index 209d657c6..256560ef8 100644
--- src/structs.h
+++ src/structs.h
@@ -964,7 +964,7 @@ typedef struct qrunner {
struct qrunner * next; /* list sorted by next tick */
uschar * name; /* NULL for the default queue */
- unsigned interval; /* tick rate, seconds */
+ unsigned interval; /* tick rate, seconds. Zero for a one-time run */
time_t next_tick; /* next run should, or should have, start(ed) */
unsigned run_max; /* concurrent queue runner limit */
unsigned run_count; /* current runners */
--
2.30.2

View File

@ -1,66 +0,0 @@
From 79670d3c32ccb37fe06f25d8192943b58606a32a Mon Sep 17 00:00:00 2001
From: Jeremy Harris <jgh146exb@wizmail.org>
Date: Fri, 17 Nov 2023 16:55:17 +0000
Subject: [PATCH] Lookups: Fix dnsdb lookup of multi-chunk TXT. Bug 3054
Broken=by: f6b1f8e7d642
Source: https://git.exim.org/exim.git/patch/79670d3c32cc
--- src/lookups/dnsdb.c.orig 2023-11-04 13:55:49.000000000 +0100
+++ src/lookups/dnsdb.c 2023-11-17 21:34:25.986385000 +0100
@@ -387,38 +387,31 @@
}
/* Other kinds of record just have one piece of data each, but there may be
- several of them, of course. */
+ several of them, of course. TXT & SPF can have data in multiple chunks. */
if (yield->ptr) yield = string_catn(yield, outsep, 1);
if (type == T_TXT || type == T_SPF)
- {
- if (!outsep2) /* output only the first item of data */
+ for (unsigned data_offset = 0; data_offset + 1 < rr->size; )
{
- uschar n = (rr->data)[0];
- /* size byte + data bytes must not excced the RRs length */
- if (n + 1 <= rr->size)
- yield = string_catn(yield, US (rr->data+1), n);
- }
- else
- for (unsigned data_offset = 0; data_offset < rr->size; )
- {
- uschar chunk_len = (rr->data)[data_offset];
- int remain = rr->size - data_offset;
+ uschar chunk_len = (rr->data)[data_offset];
+ int remain;
- /* Apparently there are resolvers that do not check RRs before passing
- them on, and glibc fails to do so. So every application must...
- Check for chunk len exceeding RR */
+ if (outsep2 && *outsep2 && data_offset != 0)
+ yield = string_catn(yield, outsep2, 1);
- if (chunk_len > remain)
- chunk_len = remain;
+ /* Apparently there are resolvers that do not check RRs before passing
+ them on, and glibc fails to do so. So every application must...
+ Check for chunk len exceeding RR */
- if (*outsep2 && data_offset != 0)
- yield = string_catn(yield, outsep2, 1);
- yield = string_catn(yield, US ((rr->data) + ++data_offset), --chunk_len);
- data_offset += chunk_len;
- }
- }
+ remain = rr->size - ++data_offset;
+ if (chunk_len > remain)
+ chunk_len = remain;
+ yield = string_catn(yield, US ((rr->data) + data_offset), chunk_len);
+ data_offset += chunk_len;
+
+ if (!outsep2) break; /* output only the first chunk of the RR */
+ }
else if (type == T_TLSA)
if (rr->size < 3)
continue;

View File

@ -1,11 +0,0 @@
--- src/tls-openssl.c.orig 2023-11-07 21:07:29.239948000 +0100
+++ src/tls-openssl.c 2023-11-07 21:08:03.517118000 +0100
@@ -2605,7 +2605,7 @@
asking for certificate-status under DANE, so this callback won't run for
that combination. It still will for non-DANE. */
-#ifdef EXIM_HAVE_OPENSSL_OCSP_RESP_GET0_SIGNER
+#if defined(EXIM_HAVE_OPENSSL_OCSP_RESP_GET0_SIGNER) && defined(SUPPORT_DANE)
X509 * signer;
if ( tls_out.dane_verified