File icinga-CVE-2016-9566.patch of Package icinga.33763

Index: icinga-1.13.3/base/logging.c
===================================================================
--- icinga-1.13.3.orig/base/logging.c
+++ icinga-1.13.3/base/logging.c
@@ -217,11 +217,18 @@ static void write_to_all_logs_with_times
 
 
 FILE *open_log_file(void) {
+    int fh;
+    struct stat st;
 
 	if (log_fp) /* keep it open unless we rotate */
 		return log_fp;
 
-	log_fp = fopen(log_file, "a+");
+    if ((fh = open(log_file, O_RDWR|O_APPEND|O_CREAT|O_NOFOLLOW, S_IRUSR|S_IWUSR)) == -1) {
+		if (daemon_mode == FALSE)
+			printf("Warning: Cannot open log file '%s' for writing\n", log_file);
+		return NULL;
+	}
+	log_fp = fdopen(fh, "a+");
 
 	if (log_fp == NULL) {
 		if (daemon_mode == FALSE) {
@@ -230,6 +237,21 @@ FILE *open_log_file(void) {
 		return NULL;
 	}
 
+    if ((fstat(fh, &st)) == -1) {
+		log_fp = NULL;
+		close(fh);
+		if (daemon_mode == FALSE)
+			printf("Warning: Cannot fstat log file '%s'\n", log_file);
+		return NULL;
+	}
+	if (st.st_nlink != 1 || (st.st_mode & S_IFMT) != S_IFREG) {
+		log_fp = NULL;
+		close(fh);
+		if (daemon_mode == FALSE)
+			printf("Warning: log file '%s' has an invalid mode\n", log_file);
+		return NULL;
+	}
+
 	(void)fcntl(fileno(log_fp), F_SETFD, FD_CLOEXEC);
 
 	return log_fp;
@@ -617,6 +639,9 @@ int write_log_file_info(time_t *timestam
 /* opens the debug log for writing */
 int open_debug_log(void) {
 
+    int fh;
+    struct stat st;
+
 	/* don't do anything if we're not actually running... */
 	if (verify_config == TRUE || test_scheduling == TRUE)
 		return OK;
@@ -625,10 +650,23 @@ int open_debug_log(void) {
 	if (debug_level == DEBUGL_NONE)
 		return OK;
 
-	if ((debug_file_fp = fopen(debug_file, "a+")) == NULL)
+    if ((fh = open(debug_file, O_RDWR|O_APPEND|O_CREAT|O_NOFOLLOW, S_IRUSR|S_IWUSR)) == -1)
+		return ERROR;
+	if((debug_file_fp = fdopen(fh, "a+")) == NULL)
+		return ERROR;
+
+	if ((fstat(fh, &st)) == -1) {
+		debug_file_fp = NULL;
+		close(fh);
 		return ERROR;
+	}
+	if (st.st_nlink != 1 || (st.st_mode & S_IFMT) != S_IFREG) {
+		debug_file_fp = NULL;
+		close(fh);
+		return ERROR;
+	}
 
-	(void)fcntl(fileno(debug_file_fp), F_SETFD, FD_CLOEXEC);
+    (void)fcntl(fh, F_SETFD, FD_CLOEXEC);
 
 	return OK;
 }
openSUSE Build Service is sponsored by