From 8805b0f25ff1409a41ecc2e054896e653e4cfa55 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Tue, 24 Jul 2012 11:11:39 +0200 Subject: bugfix: DA queue could cause abort ...due to invalid mutex synchronisation in DA worker. In case of idle queue, mutex was incorrectly locked. --- runtime/queue.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'runtime') diff --git a/runtime/queue.c b/runtime/queue.c index d78ab2e3..280ebd94 100644 --- a/runtime/queue.c +++ b/runtime/queue.c @@ -1743,6 +1743,7 @@ ConsumerDA(qqueue_t *pThis, wti_t *pWti) { int i; int iCancelStateSave; + int bNeedReLock = 0; /**< do we need to lock the mutex again? */ DEFiRet; ISOBJ_TYPE_assert(pThis, qqueue); @@ -1752,6 +1753,7 @@ ConsumerDA(qqueue_t *pThis, wti_t *pWti) /* we now have a non-idle batch of work, so we can release the queue mutex and process it */ d_pthread_mutex_unlock(pThis->mut); + bNeedReLock = 1; /* at this spot, we may be cancelled */ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &iCancelStateSave); @@ -1770,10 +1772,10 @@ ConsumerDA(qqueue_t *pThis, wti_t *pWti) /* but now cancellation is no longer permitted */ pthread_setcancelstate(iCancelStateSave, NULL); - /* now we are done, but need to re-aquire the mutex */ - d_pthread_mutex_lock(pThis->mut); - finalize_it: + /* now we are done, but potentially need to re-aquire the mutex */ + if(bNeedReLock) + d_pthread_mutex_lock(pThis->mut); DBGOPRINT((obj_t*) pThis, "DAConsumer returns with iRet %d\n", iRet); RETiRet; } -- cgit From f043778bdc23c7b2baf18c1fc35ba47fa4d8386c Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Tue, 24 Jul 2012 11:20:21 +0200 Subject: bugfix: strm class could abort under some circumstances ... it could pass a NULL pointer to unlink. Depending on OS implementation, this could (or could not...) lead to a segfault. --- runtime/stream.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'runtime') diff --git a/runtime/stream.c b/runtime/stream.c index 6b88d3f4..bb1a0a42 100644 --- a/runtime/stream.c +++ b/runtime/stream.c @@ -16,7 +16,7 @@ * it turns out to be problematic. Then, we need to quasi-refcount the number of accesses * to the object. * - * Copyright 2008, 2009 Rainer Gerhards and Adiscon GmbH. + * Copyright 2008-2012 Rainer Gerhards and Adiscon GmbH. * * This file is part of the rsyslog runtime library. * @@ -361,7 +361,7 @@ static rsRetVal strmCloseFile(strm_t *pThis) pThis->fdDir = -1; } - if(pThis->bDeleteOnClose) { + if(pThis->bDeleteOnClose && pThis->pszCurrFName != NULL) { if(unlink((char*) pThis->pszCurrFName) == -1) { char errStr[1024]; int err = errno; @@ -369,14 +369,12 @@ static rsRetVal strmCloseFile(strm_t *pThis) DBGPRINTF("error %d unlinking '%s' - ignored: %s\n", errno, pThis->pszCurrFName, errStr); } - } - - pThis->iCurrOffs = 0; /* we are back at begin of file */ - if(pThis->pszCurrFName != NULL) { free(pThis->pszCurrFName); /* no longer needed in any case (just for open) */ pThis->pszCurrFName = NULL; } + pThis->iCurrOffs = 0; /* we are back at begin of file */ + RETiRet; } -- cgit