From bcff0f7ee876da5457a6f5072487138dc5fcc679 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan.bosch@open-xchange.com>
Date: Sun, 6 Dec 2020 03:19:36 +0100
Subject: [PATCH] lib-sieve: sieve - Check binary for resource limits before
 opening in sieve_script_open().

---
 src/lib-sieve/sieve.c | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index b3e560df8..80455b6db 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -382,6 +382,12 @@ sieve_open_script_real(struct sieve_script *script,
 	struct sieve_instance *svinst = sieve_script_svinst(script);
 	struct sieve_resource_usage rusage;
 	struct sieve_binary *sbin;
+	enum sieve_error error;
+	const char *errorstr = NULL;
+	int ret;
+
+	if (error_r == NULL)
+		error_r = &error;
 
 	sieve_resource_usage_init(&rusage);
 
@@ -391,7 +397,8 @@ sieve_open_script_real(struct sieve_script *script,
 		sieve_binary_get_resource_usage(sbin, &rusage);
 
 		/* Ok, it exists; now let's see if it is up to date */
-		if (!sieve_binary_up_to_date(sbin, flags)) {
+		if (!sieve_resource_usage_is_excessive(svinst, &rusage) &&
+		    !sieve_binary_up_to_date(sbin, flags)) {
 			/* Not up to date */
 			e_debug(svinst->event,
 				"Script binary %s is not up-to-date",
@@ -420,6 +427,31 @@ sieve_open_script_real(struct sieve_script *script,
 		sieve_binary_set_resource_usage(sbin, &rusage);
 	}
 
+	/* Check whether binary can be executed. */
+	ret = sieve_binary_check_executable(sbin, error_r, &errorstr);
+	if (ret <= 0) {
+		const char *path = sieve_binary_path(sbin);
+
+		if (path != NULL) {
+			e_debug(svinst->event,
+				"Script binary %s cannot be executed",
+				path);
+		} else {
+			e_debug(svinst->event,
+				"Script binary from %s cannot be executed",
+				sieve_binary_source(sbin));
+		}
+		if (ret < 0) {
+			sieve_internal_error(ehandler,
+					     sieve_script_name(script),
+					     "failed to open script");
+		} else {
+			sieve_error(ehandler, sieve_script_name(script),
+				    "%s", errorstr);
+		}
+		sieve_binary_close(&sbin);
+	}
+
 	return sbin;
 }
 
-- 
GitLab