From 882f404873ab8410455b17c3e7940e5c645bd143 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Sun, 22 Nov 2015 23:15:27 +0300 Subject: [PATCH] Fix imjournal state file issues Derived from upstream: * commit 64af99a: imjournal: Initialize counter outside of while loop * commit 8a10940: bugfix: afterRun entry point not correctly called The entry point was called at the wrong spot, only when the thread had not already terminated by itself. This could cause various cleanup to not be done. closes https://github.com/rsyslog/rsyslog/issues/882 * fix a segfault in imuxsock triggered by 8a10940 --- plugins/imjournal/imjournal.c | 3 ++- plugins/imuxsock/imuxsock.c | 4 ++++ threads.c | 9 +++++---- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/imjournal/imjournal.c b/plugins/imjournal/imjournal.c index 36c7e04..65017c6 100755 --- a/plugins/imjournal/imjournal.c +++ b/plugins/imjournal/imjournal.c @@ -588,6 +588,7 @@ finalize_it: } BEGINrunInput + int count = 0; CODESTARTrunInput CHKiRet(ratelimitNew(&ratelimiter, "imjournal", NULL)); dbgprintf("imjournal: ratelimiting burst %d, interval %d\n", cs.ratelimitBurst, @@ -603,7 +604,7 @@ CODESTARTrunInput * signalled to do so. This, however, is handled by the framework. */ while (glbl.GetGlobalInputTermState() == 0) { - int count = 0, r; + int r; r = sd_journal_next(j); if (r < 0) { diff --git a/plugins/imuxsock/imuxsock.c b/plugins/imuxsock/imuxsock.c index df504dd..f50b912 100644 --- a/plugins/imuxsock/imuxsock.c +++ b/plugins/imuxsock/imuxsock.c @@ -1419,6 +1419,10 @@ BEGINafterRun int i; CODESTARTafterRun /* do cleanup here */ + if(startIndexUxLocalSockets == 1 && nfd == 1) { + /* No sockets were configured, no cleanup needed. */ + return RS_RET_OK; + } /* Close the UNIX sockets. */ for (i = 0; i < nfd; i++) if (listeners[i].fd != -1) diff --git a/threads.c b/threads.c index 990733a..a38b18f 100644 --- a/threads.c +++ b/threads.c @@ -79,6 +79,11 @@ static rsRetVal thrdDestruct(thrdInfo_t *pThis) if(pThis->bIsActive == 1) { thrdTerminate(pThis); } + + /* call cleanup function, if any */ + if(pThis->pAfterRun != NULL) + pThis->pAfterRun(pThis); + pthread_mutex_destroy(&pThis->mutThrd); pthread_cond_destroy(&pThis->condThrdTerm); free(pThis->name); @@ -148,10 +153,6 @@ rsRetVal thrdTerminate(thrdInfo_t *pThis) } pthread_join(pThis->thrdID, NULL); /* wait for input thread to complete */ - /* call cleanup function, if any */ - if(pThis->pAfterRun != NULL) - pThis->pAfterRun(pThis); - RETiRet; } -- 2.5.5