Blame SOURCES/cronie-1.4.11-getdtablesize-in-containers.patch

8d663c
From 049e5728ad3e8b48c521467fb7c3f98fb073ab54 Mon Sep 17 00:00:00 2001
8d663c
From: Flos Qi Guo <qguo@redhat.com>
8d663c
Date: Fri, 26 Nov 2021 03:32:11 +0000
8d663c
Subject: [PATCH] Avoid allocating huge arrays by maxing the fd number to
8d663c
 MAX_CLOSE_FD
8d663c
8d663c
 - Partially backport patch from rhbz#1723106
8d663c
8d663c
diff --git a/src/database.c b/src/database.c
8d663c
index e1ec309..73da572 100644
8d663c
--- a/src/database.c
8d663c
+++ b/src/database.c
8d663c
@@ -47,9 +47,6 @@
8d663c
 #include "globals.h"
8d663c
 #include "pathnames.h"
8d663c
 
8d663c
-#define TMAX(a,b) ((a)>(b)?(a):(b))
8d663c
-#define TMIN(a,b) ((a)<(b)?(a):(b))
8d663c
-
8d663c
 /* size of the event structure, not counting name */
8d663c
 #define EVENT_SIZE  (sizeof (struct inotify_event))
8d663c
 
8d663c
diff --git a/src/macros.h b/src/macros.h
8d663c
index 6c7ca6d..238012a 100644
8d663c
--- a/src/macros.h
8d663c
+++ b/src/macros.h
8d663c
@@ -58,6 +58,7 @@
8d663c
 #define	MAX_UNAME	256	/* max length of username  */
8d663c
 #define	ROOT_UID	0	/* don't change this, it really must be root */
8d663c
 #define	ROOT_USER	"root"	/* ditto */
8d663c
+#define	MAX_CLOSE_FD	10000	/* max fd num to close when spawning a child process */
8d663c
 
8d663c
 				/* NOTE: these correspond to DebugFlagNames,
8d663c
 				 *	defined below.
8d663c
@@ -126,6 +127,9 @@
8d663c
 #define	LAST_DOW	7
8d663c
 #define	DOW_COUNT	(LAST_DOW - FIRST_DOW + 1)
8d663c
 
8d663c
+#define TMAX(a,b) ((a)>(b)?(a):(b))
8d663c
+#define TMIN(a,b) ((a)<(b)?(a):(b))
8d663c
+
8d663c
 /*
8d663c
  * Because crontab/at files may be owned by their respective users we
8d663c
  * take extreme care in opening them.  If the OS lacks the O_NOFOLLOW
8d663c
diff --git a/src/popen.c b/src/popen.c
8d663c
index aa36ff7..6262d8c 100644
8d663c
--- a/src/popen.c
8d663c
+++ b/src/popen.c
8d663c
@@ -80,12 +80,19 @@ FILE *cron_popen(char *program, const char *type, struct passwd *pw) {
8d663c
 	if (!pids) {
8d663c
 		if ((fds = getdtablesize()) <= 0)
8d663c
 			return (NULL);
8d663c
+		if (fds > MAX_CLOSE_FD)
8d663c
+			fds = MAX_CLOSE_FD; /* avoid allocating too much memory */
8d663c
 		if (!(pids = (PID_T *) malloc((u_int) (fds * sizeof (PID_T)))))
8d663c
 			return (NULL);
8d663c
-		memset((char *) pids, 0, fds * sizeof (PID_T));
8d663c
+		memset((char *) pids, 0, (u_int)(fds * sizeof (PID_T)));
8d663c
 	}
8d663c
 	if (pipe(pdes) < 0)
8d663c
 		return (NULL);
8d663c
+	if (pdes[0] >= fds || pdes[1] >= fds) {
8d663c
+		(void) close(pdes[0]);
8d663c
+		(void) close(pdes[1]);
8d663c
+		return NULL;
8d663c
+	}
8d663c
 
8d663c
 	/* break up string into pieces */
8d663c
 	for (argc = 0, cp = program; argc < MAX_ARGS; cp = NULL)