summaryrefslogtreecommitdiffstats
path: root/tools/omfile.c
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2010-03-05 07:56:07 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2010-03-05 07:56:07 +0100
commit56764b912ea944a0abc7d92429d7520c2247cdd9 (patch)
tree7719d2f8589a5eb0cb8ef5505c6b73f3d417e247 /tools/omfile.c
parent2a494ffc41cd33124bbfea01ad41750b8967efed (diff)
parent0b84d47f7a244c25f63fadcec92d12ebfbe319a4 (diff)
downloadrsyslog-56764b912ea944a0abc7d92429d7520c2247cdd9.tar.gz
rsyslog-56764b912ea944a0abc7d92429d7520c2247cdd9.tar.xz
rsyslog-56764b912ea944a0abc7d92429d7520c2247cdd9.zip
Merge branch 'v4-stable' into v4-stable-solaris
Diffstat (limited to 'tools/omfile.c')
-rw-r--r--tools/omfile.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/tools/omfile.c b/tools/omfile.c
index 069fc078..eb56201c 100644
--- a/tools/omfile.c
+++ b/tools/omfile.c
@@ -318,6 +318,7 @@ dynaFileFreeCacheEntries(instanceData *pData)
for(i = 0 ; i < pData->iCurrCacheSize ; ++i) {
dynaFileDelCacheEntry(pData->dynCache, i, 1);
}
+ pData->iCurrElt = -1; /* invalidate current element */
ENDfunc;
}
@@ -486,6 +487,14 @@ prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsgOpts)
}
/* we have not found an entry */
+
+ /* invalidate iCurrElt as we may error-exit out of this function when the currrent
+ * iCurrElt has been freed or otherwise become unusable. This is a precaution, and
+ * performance-wise it may be better to do that in each of the exits. However, that
+ * is error-prone, so I prefer to do it here. -- rgerhards, 2010-03-02
+ */
+ pData->iCurrElt = -1;
+
if(iFirstFree == -1 && (pData->iCurrCacheSize < pData->iDynaFileCacheSize)) {
/* there is space left, so set it to that index */
iFirstFree = pData->iCurrCacheSize++;
@@ -517,7 +526,11 @@ prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsgOpts)
ABORT_FINALIZE(localRet);
}
- CHKmalloc(pCache[iFirstFree]->pName = ustrdup(newFileName));
+ if((pCache[iFirstFree]->pName = ustrdup(newFileName)) == NULL) {
+ /* we need to discard the entry, otherwise things could lead to a segfault! */
+ dynaFileDelCacheEntry(pCache, iFirstFree, 1);
+ ABORT_FINALIZE(RS_RET_OUT_OF_MEMORY);
+ }
pCache[iFirstFree]->pStrm = pData->pStrm;
pCache[iFirstFree]->lastUsed = time(NULL); // monotonically increasing value! TODO: performance
pData->iCurrElt = iFirstFree;
@@ -752,7 +765,6 @@ BEGINdoHUP
CODESTARTdoHUP
if(pData->bDynamicName) {
dynaFileFreeCacheEntries(pData);
- pData->iCurrElt = -1; /* invalidate current element */
} else {
if(pData->pStrm != NULL) {
strm.Destruct(&pData->pStrm);