summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2011-05-03 09:41:35 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2011-05-03 09:41:35 +0200
commit678a904620222b9113db8b5f89e988a064b05cd9 (patch)
treeafe63a0170fd0402a80b494abcfb49093287690a
parent921bebc8ee203c0569332c636515c4de036dfcf9 (diff)
downloadrsyslog-678a904620222b9113db8b5f89e988a064b05cd9.tar.gz
rsyslog-678a904620222b9113db8b5f89e988a064b05cd9.tar.xz
rsyslog-678a904620222b9113db8b5f89e988a064b05cd9.zip
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
-rw-r--r--ChangeLog6
-rw-r--r--runtime/stream.c11
2 files changed, 17 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 16928921..2bd52a85 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,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 af38bcb7..a12dda41 100644
--- a/runtime/stream.c
+++ b/runtime/stream.c
@@ -258,6 +258,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);
@@ -289,6 +290,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;
}