git: 959521fd0d96 - main - sysutils/rsyslog8: patch for forking issue due to close_range() call

From: Matthew Seaman <matthew_at_FreeBSD.org>
Date: Tue, 24 Oct 2023 21:09:04 UTC
The branch main has been updated by matthew:

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

commit 959521fd0d960b4bf9938a2229f29959ee2f8fa3
Author:     Nathan Huff <nhuff@acm.org>
AuthorDate: 2023-10-24 21:04:00 +0000
Commit:     Matthew Seaman <matthew@FreeBSD.org>
CommitDate: 2023-10-24 21:08:41 +0000

    sysutils/rsyslog8: patch for forking issue due to close_range() call
    
    Add patch from upstream:
    
    https://github.com/rsyslog/rsyslog/commit/599b5c7524b76cfc73245206fcce1e2b4d955f21
    
    After fork if the child process uses close_range to close open file
    descriptors it has no way to exempt the parentPipeFD causing a failure
    to signal successful startup to the parent process. This causes
    failures on all systems that aren't Linux that implement close_range.
    
    1. Loop through file descriptors between beginClose and
       MAX(parentPipeFD,dbgGetDbglogFd()) making sure not to close those two
       file descriptors.
    
    2. Potentially use close_range to close all file descriptors above
       MAX(parentPipeFD,dbgGetDbglogFd())
    
    PR:             274509
    Reported by:    Helmut Ritter
    Obtained from:  https://github.com/rsyslog/rsyslog/pull/5254
---
 sysutils/rsyslog8/Makefile                     |  4 +--
 sysutils/rsyslog8/files/patch-tools_rsyslogd.c | 36 ++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/sysutils/rsyslog8/Makefile b/sysutils/rsyslog8/Makefile
index 8df79aa1a249..a81c1ce7fae3 100644
--- a/sysutils/rsyslog8/Makefile
+++ b/sysutils/rsyslog8/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	rsyslog
 PORTVERSION=	8.2310.0
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	sysutils
 MASTER_SITES=	http://www.rsyslog.com/files/download/rsyslog/
 
@@ -8,8 +8,6 @@ MAINTAINER=	matthew@FreeBSD.org
 COMMENT=	Syslogd supporting SQL, TCP, and TLS
 WWW=		https://www.rsyslog.com/
 
-BROKEN=		"Socket operation on non-socket" See PR 274509
-
 LICENSE=	GPLv3 LGPL3 APACHE20
 LICENSE_COMB=	multi
 
diff --git a/sysutils/rsyslog8/files/patch-tools_rsyslogd.c b/sysutils/rsyslog8/files/patch-tools_rsyslogd.c
new file mode 100644
index 000000000000..a4fdaf7a965c
--- /dev/null
+++ b/sysutils/rsyslog8/files/patch-tools_rsyslogd.c
@@ -0,0 +1,36 @@
+--- tools/rsyslogd.c.orig	2023-10-09 07:12:48 UTC
++++ tools/rsyslogd.c
+@@ -460,19 +460,24 @@ prepareBackground(const int parentPipeFD)
+ 		/* try MacOS, FreeBSD */
+ 		if(close_unneeded_open_files("/proc/fd", beginClose, parentPipeFD) != 0) {
+ 			/* did not work out, so let's close everything... */
+-			const int endClose = getdtablesize();
+-#		if defined(HAVE_CLOSE_RANGE)
+-			if(close_range(beginClose, endClose, 0) != 0) {
++			int endClose = (parentPipeFD > dbgGetDbglogFd()) ? parentPipeFD : dbgGetDbglogFd();
++			for(int i = beginClose ; i <= endClose ; ++i) {
++				if((i != dbgGetDbglogFd()) && (i != parentPipeFD)) {
++					aix_close_it(i); /* AIXPORT */
++				}
++			}
++			beginClose = endClose + 1;
++			endClose = getdtablesize();
++#if defined(HAVE_CLOSE_RANGE)
++			if(close_range(beginClose, endClose, 0) !=0) {
+ 				dbgprintf("errno %d after close_range(), fallback to loop\n", errno);
+-#		endif
++#endif
+ 				for(int i = beginClose ; i <= endClose ; ++i) {
+-					if((i != dbgGetDbglogFd()) && (i != parentPipeFD)) {
+-						  aix_close_it(i); /* AIXPORT */
+-					}
++					aix_close_it(i); /* AIXPORT */
+ 				}
+-#		if defined(HAVE_CLOSE_RANGE)
++#if defined(HAVE_CLOSE_RANGE)
+ 			}
+-#		endif
++#endif
+ 		}
+ 	}
+ 	seedRandomNumberForChild();