summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2010-03-25 07:56:03 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2010-03-25 07:56:03 +0100
commit28b3703c95cb06642ff245f4d7e265c4591c128f (patch)
treed739e41dd9f2ba32a949d7496453f21baff0db28 /tools
parent9e5b31fc44136dbcc1e443cfe7714e9daf97d844 (diff)
downloadrsyslog-28b3703c95cb06642ff245f4d7e265c4591c128f.tar.gz
rsyslog-28b3703c95cb06642ff245f4d7e265c4591c128f.tar.xz
rsyslog-28b3703c95cb06642ff245f4d7e265c4591c128f.zip
bugfix: potential segfault in dynafile cache
This bug was triggered by an open failure. The the cache was full and a new entry needed to be placed inside it, a victim for eviction was selected. That victim was freed, then the open of the new file tried. If the open failed, the victim entry was still freed, and the function exited. However, on next invocation and cache search, the victim entry was used as if it were populated, most probably resulting in a segfault.
Diffstat (limited to 'tools')
-rw-r--r--tools/omfile.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/tools/omfile.c b/tools/omfile.c
index 91bcf0c2..2a14f45b 100644
--- a/tools/omfile.c
+++ b/tools/omfile.c
@@ -471,7 +471,7 @@ prepareDynFile(instanceData *pData, uchar *newFileName, unsigned iMsgOpts)
iOldest = 0; /* we assume the first element to be the oldest - that will change as we loop */
ttOldest = time(NULL) + 1; /* there must always be an older one */
for(i = 0 ; i < pData->iCurrCacheSize ; ++i) {
- if(pCache[i] == NULL) {
+ if(pCache[i] == NULL || pCache[i]->pName == NULL) {
if(iFirstFree == -1)
iFirstFree = i;
} else { /* got an element, let's see if it matches */