git: caa5c5a85b78 - main - mail/exim: backport fix for dnsdb bug from upstream (+)

From: Dima Panov <fluffy_at_FreeBSD.org>
Date: Sun, 19 Nov 2023 12:02:25 UTC
The branch main has been updated by fluffy:

URL: https://cgit.FreeBSD.org/ports/commit/?id=caa5c5a85b787e0676fd33fa85d6856888adea12

commit caa5c5a85b787e0676fd33fa85d6856888adea12
Author:     Dima Panov <fluffy@FreeBSD.org>
AuthorDate: 2023-11-19 10:47:13 +0000
Commit:     Dima Panov <fluffy@FreeBSD.org>
CommitDate: 2023-11-19 12:02:15 +0000

    mail/exim: backport fix for dnsdb bug from upstream (+)
    
    PR:             275156
    See Also:       https://bugs.exim.org/show_bug.cgi?id=3054
---
 mail/exim/Makefile                        |  2 +-
 mail/exim/files/patch-src-lookups-dnsdb.c | 66 +++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/mail/exim/Makefile b/mail/exim/Makefile
index a871d312df4f..3fb85f42e8b8 100644
--- a/mail/exim/Makefile
+++ b/mail/exim/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	exim
 PORTVERSION?=	${EXIM_VERSION}
-PORTREVISION?=	1
+PORTREVISION?=	2
 CATEGORIES=	mail
 MASTER_SITES=	EXIM:exim
 MASTER_SITE_SUBDIR=	/exim4/:exim \
diff --git a/mail/exim/files/patch-src-lookups-dnsdb.c b/mail/exim/files/patch-src-lookups-dnsdb.c
new file mode 100644
index 000000000000..2e8438c122ec
--- /dev/null
+++ b/mail/exim/files/patch-src-lookups-dnsdb.c
@@ -0,0 +1,66 @@
+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;