summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2011-05-03 09:46:52 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2011-05-03 09:46:52 +0200
commita4318f941a8e7a6ff2816a1f9df87f35f65af4a6 (patch)
tree61a0d8cf0fa650760c7262ec6973471536dedd53
parent466e0264015ba5ed100c120365c31a250105c0bb (diff)
parent678a904620222b9113db8b5f89e988a064b05cd9 (diff)
downloadrsyslog-a4318f941a8e7a6ff2816a1f9df87f35f65af4a6.tar.gz
rsyslog-a4318f941a8e7a6ff2816a1f9df87f35f65af4a6.tar.xz
rsyslog-a4318f941a8e7a6ff2816a1f9df87f35f65af4a6.zip
Merge branch 'v4-stable' into v5-stable
-rw-r--r--ChangeLog6
-rw-r--r--runtime/stream.c11
2 files changed, 17 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ab1bd66d..cde831a3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -806,6 +806,12 @@ Version 4.6.6 [v4-stable] (rgerhards), 2010-11-??
- bugfix: IPv6-address could not be specified in omrelp
this was due to improper parsing of ":"
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=250
+- bugfix: memory and file descriptor leak in stream processing
+ Leaks could occur under some circumstances if the file stream handler
+ errored out during the open call. Among others, this could cause very
+ big memory leaks if there were a problem with unreadable disk queue
+ files. In regard to the memory leak, this
+ closes: http://bugzilla.adiscon.com/show_bug.cgi?id=256
- bugfix: imfile potentially duplicates lines
This can happen when 0 bytes are read from the input file, and some
writer appends data to the file BEFORE we check if a rollover happens.
diff --git a/runtime/stream.c b/runtime/stream.c
index 24dbcc09..ae716815 100644
--- a/runtime/stream.c
+++ b/runtime/stream.c
@@ -259,6 +259,7 @@ static rsRetVal strmOpenFile(strm_t *pThis)
if(pThis->fd != -1)
ABORT_FINALIZE(RS_RET_OK);
+ pThis->pszCurrFName = NULL; /* used to prevent mem leak in case of error */
if(pThis->pszFName == NULL)
ABORT_FINALIZE(RS_RET_FILE_PREFIX_MISSING);
@@ -290,6 +291,16 @@ static rsRetVal strmOpenFile(strm_t *pThis)
(pThis->tOperationsMode == STREAMMODE_READ) ? "READ" : "WRITE", pThis->fd);
finalize_it:
+ if(iRet != RS_RET_OK) {
+ if(pThis->pszCurrFName != NULL) {
+ free(pThis->pszCurrFName);
+ pThis->pszCurrFName = NULL; /* just to prevent mis-adressing down the road... */
+ }
+ if(pThis->fd != -1) {
+ close(pThis->fd);
+ pThis->fd = -1;
+ }
+ }
RETiRet;
}