Blame SOURCES/rsyslog-8.24.0-rhbz1632211-journal-cursor-fix.patch

fde8c1
From: Jiri Vymazal <jvymazal@redhat.com>
fde8c1
Date: Thu, 14 Mar 2019 10:58:03 +0100
fde8c1
Subject: [PATCH] Journal cursor related fixes
fde8c1
fde8c1
Added missing free() calls of received journal cursor
fde8c1
In one case there was possibility of free()'d value of journal
fde8c1
cursor not being reset, causing double-free and crash later on.
fde8c1
Not trying to get and save position of invalid journal
fde8c1
---
fde8c1
 plugins/imjournal/imjournal.c | 28 +++++----
fde8c1
 1 file changed, 15 insertions(+), 13 deletitions(-)
fde8c1
fde8c1
diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c
fde8c1
index a85e52100..f5c2be4b6 100644
fde8c1
--- a/plugins/imjournal/imjournal.c
fde8c1
+++ b/plugins/imjournal/imjournal.c
fde8c1
@@ -121,7 +121,7 @@
fde8c1
 
fde8c1
 #define J_PROCESS_PERIOD 1024  /* Call sd_journal_process() every 1,024 records */
fde8c1
 
fde8c1
-static rsRetVal persistJournalState(void);
fde8c1
+static rsRetVal persistJournalState(int trySave);
fde8c1
 static rsRetVal loadJournalState(void);
fde8c1
 
fde8c1
 static rsRetVal openJournal(sd_journal** jj) {
fde8c1
@@ -140,10 +140,10 @@
fde8c1
 	RETiRet;
fde8c1
 }
fde8c1
 
fde8c1
-static void closeJournal(sd_journal** jj) {
fde8c1
+static void closeJournal(sd_journal** jj, int trySave) {
fde8c1
 
fde8c1
 	if (cs.stateFile) { /* can't persist without a state file */
fde8c1
-		persistJournalState();
fde8c1
+		persistJournalState(trySave);
fde8c1
 	}
fde8c1
 	sd_journal_close(*jj);
fde8c1
 	j_inotify_fd = 0;
fde8c1
@@ -433,7 +434,7 @@
fde8c1
 /* This function gets journal cursor and saves it into state file
fde8c1
  */
fde8c1
 static rsRetVal
fde8c1
-persistJournalState (void)
fde8c1
+persistJournalState(int trySave)
fde8c1
 {
fde8c1
 	DEFiRet;
fde8c1
 	FILE *sf; /* state file */
fde8c1
@@ -443,12 +444,13 @@
fde8c1
 	if (cs.bWorkAroundJournalBug) {
fde8c1
 		if (!last_cursor)
fde8c1
 			ABORT_FINALIZE(RS_RET_OK);
fde8c1
-
fde8c1
-	} else if ((ret = sd_journal_get_cursor(j, &last_cursor)) < 0) {
fde8c1
-		char errStr[256];
fde8c1
-		rs_strerror_r(-(ret), errStr, sizeof(errStr));
fde8c1
-		errmsg.LogError(0, RS_RET_ERR, "sd_journal_get_cursor() failed: '%s'\n", errStr);
fde8c1
-		ABORT_FINALIZE(RS_RET_ERR);
fde8c1
+	} else if (trySave) {
fde8c1
+		if ((ret = sd_journal_get_cursor(j, &last_cursor))) {
fde8c1
+			LogError(-ret, RS_RET_ERR, "imjournal: sd_journal_get_cursor() failed");
fde8c1
+			ABORT_FINALIZE(RS_RET_ERR);
fde8c1
+		}
fde8c1
+	} else { /* not trying to get cursor out of invalid journal state */
fde8c1
+		ABORT_FINALIZE(RS_RET_OK);
fde8c1
 	}
fde8c1
 	/* we create a temporary name by adding a ".tmp"
fde8c1
 	 * suffix to the end of our state file's name
fde8c1
@@ -501,7 +506,7 @@
fde8c1
 	r = sd_journal_wait(j, POLL_TIMEOUT);
fde8c1
 
fde8c1
 	if (r == SD_JOURNAL_INVALIDATE) {
fde8c1
-		closeJournal(&j);
fde8c1
+		closeJournal(&j, 0);
fde8c1
 
fde8c1
 		iRet = openJournal(&j);
fde8c1
 		if (iRet != RS_RET_OK)
fde8c1
@@ -628,7 +634,7 @@
fde8c1
 tryRecover(void) {
fde8c1
 	errmsg.LogMsg(0, RS_RET_OK, LOG_INFO, "imjournal: trying to recover from unexpected "
fde8c1
 		"journal error");
fde8c1
-	closeJournal(&j);
fde8c1
+	closeJournal(&j, 1);
fde8c1
 	srSleep(10, 0);	// do not hammer machine with too-frequent retries
fde8c1
 	openJournal(&j);
fde8c1
 }
fde8c1
@@ -708,7 +708,7 @@
fde8c1
 		if (cs.stateFile) { /* can't persist without a state file */
fde8c1
 			/* TODO: This could use some finer metric. */
fde8c1
 			if ((count % cs.iPersistStateInterval) == 0) {
fde8c1
-				persistJournalState();
fde8c1
+				persistJournalState(1);
fde8c1
 			}
fde8c1
 		}
fde8c1
 	}
fde8c1
@@ -764,7 +764,7 @@
fde8c1
 /* close journal */
fde8c1
 BEGINafterRun
fde8c1
 CODESTARTafterRun
fde8c1
-	closeJournal(&j);
fde8c1
+	closeJournal(&j, 1);
fde8c1
 	ratelimitDestruct(ratelimiter);
fde8c1
 ENDafterRun
fde8c1
 
fde8c1