summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog30
-rw-r--r--Makefile.am1
-rw-r--r--action.c9
-rw-r--r--configure.ac11
-rw-r--r--doc/rsyslog_ng_comparison.html9
-rw-r--r--runtime/msg.h17
-rw-r--r--runtime/parser.c16
-rw-r--r--runtime/prop.c2
-rw-r--r--runtime/queue.c2
-rw-r--r--runtime/rule.c2
-rw-r--r--runtime/ruleset.c2
11 files changed, 78 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index bde56d58..daba1e66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,9 @@ Version 5.1.5 [DEVEL] (rgerhards), 2009-08-??
malformed, thus causing them to be treated as TAG (this was a regression
introduced from the "rfc3164 strict" change in 4.5.0). Testbench has been
updated to include a smaple message with a hostname containing a dash.
+- bugfix: strings improperly reused, resulting in some message properties
+ be populated with strings from previous messages. This was caused by
+ an improper predicate check.
---------------------------------------------------------------------------
Version 5.1.4 [DEVEL] (rgerhards), 2009-08-20
- legacy syslog parser changed so that it now accepts date stamps in
@@ -107,6 +110,17 @@ increase.
- increased ompgsql performance by adapting to new transactional
output module interface
---------------------------------------------------------------------------
+Version 4.5.3 [v4-beta] (rgerhards), 2009-08-??
+- bugfix: message sanitation had some issues:
+ - control character DEL was not properly escaped
+ - NUL and LF characters were not properly stripped if no control
+ character replacement was to be done
+ - NUL characters in the message body were silently dropped (this was
+ a regeression introduced by some of the recent optimizations)
+- bugfix: strings improperly reused, resulting in some message properties
+ be populated with strings from previous messages. This was caused by
+ an improper predicate check. [backported from v5]
+---------------------------------------------------------------------------
Version 4.5.2 [v4-beta] (rgerhards), 2009-08-21
- legacy syslog parser changed so that it now accepts date stamps in
wrong case. Some devices seem to create them and I do not see any harm
@@ -198,6 +212,22 @@ Version 4.5.0 [DEVEL] (rgerhards), 2009-07-02
This could lead to timestamps written in the wrong format, but not to
an abort
---------------------------------------------------------------------------
+Version 4.4.1 [v4-stable] (rgerhards), 2009-08-??
+- features requiring Java are automatically disabled if Java is not
+ present (thanks to Michael Biebl for his help!)
+- bugfix: invalid double-quoted PRI, among others in outgoing messages
+ This causes grief with all receivers.
+ Bug tracker: http://bugzilla.adiscon.com/show_bug.cgi?id=147
+- bugfix: Java testing tools were required, even if testbench was disabled
+ This resulted in build errors if no Java was present on the build system,
+ even though none of the selected option actually required Java.
+ (I forgot to backport a similar fix to newer releases).
+- bugfix (backport): omfwd segfault
+ Note that the orginal (higher version) patch states this happens only
+ when debugging mode is turned on. That statement is wrong: if debug
+ mode is turned off, the message is not being emitted, but the division
+ by zero in the actual parameters still happens.
+---------------------------------------------------------------------------
Version 4.4.0 [v4-stable] (rgerhards), 2009-08-21
- bugfix: stderr/stdout were not closed to be able to emit error messages,
but this caused ssh sessions to hang. Now we close them after the
diff --git a/Makefile.am b/Makefile.am
index 37795233..be47e9f0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,7 +1,6 @@
sbin_PROGRAMS =
pkglib_LTLIBRARIES =
-
if ENABLE_INET
pkglib_LTLIBRARIES += lmtcpsrv.la lmtcpclt.la
#
diff --git a/action.c b/action.c
index 1e02d23e..d8ccafb6 100644
--- a/action.c
+++ b/action.c
@@ -809,7 +809,6 @@ tryDoAction(action_t *pAction, batch_t *pBatch, int *pnElem)
assert(pBatch != NULL);
assert(pnElem != NULL);
-dbgprintf("XXXX: ENTER tryDoAction elt 0 state %d\n", pBatch->pElem[0].state);
i = pBatch->iDoneUpTo; /* all messages below that index are processed */
iElemProcessed = 0;
@@ -835,7 +834,6 @@ dbgprintf("XXXX: ENTER tryDoAction elt 0 state %d\n", pBatch->pElem[0].state);
pBatch->pElem[i].state = BATCH_STATE_SUB;
} else if(localRet == RS_RET_DISCARDMSG) {
pBatch->pElem[i].state = BATCH_STATE_DISC;
-dbgprintf("XXXX: discardmsg! change state to _DISC: %d\n", pBatch->pElem[i].state);
} else {
iRet = localRet;
FINALIZE;
@@ -852,7 +850,6 @@ finalize_it:
*pnElem += iCommittedUpTo - pBatch->iDoneUpTo;
pBatch->iDoneUpTo = iCommittedUpTo;
}
-dbgprintf("XXXX: done tryDoAction elt 0 state %d, iret %d\n", pBatch->pElem[0].state, iRet);
RETiRet;
}
@@ -875,7 +872,6 @@ submitBatch(action_t *pAction, batch_t *pBatch, int nElem)
bDone = 0;
do {
localRet = tryDoAction(pAction, pBatch, &nElem);
-dbgprintf("XXXX: submitBatch got state %d\n", localRet);
if( localRet == RS_RET_OK
|| localRet == RS_RET_PREVIOUS_COMMITTED
|| localRet == RS_RET_DEFER_COMMIT) {
@@ -885,7 +881,6 @@ dbgprintf("XXXX: submitBatch got state %d\n", localRet);
localRet = finishBatch(pAction);
}
-dbgprintf("XXXX: submitBatch got state %d\n", localRet);
if( localRet == RS_RET_OK
|| localRet == RS_RET_PREVIOUS_COMMITTED
|| localRet == RS_RET_DEFER_COMMIT) {
@@ -893,7 +888,6 @@ dbgprintf("XXXX: submitBatch got state %d\n", localRet);
} else if(localRet == RS_RET_DISCARDMSG) {
iRet = RS_RET_DISCARDMSG; /* TODO: verify this sequence -- rgerhards, 2009-07-30 */
bDone = 1;
-dbgprintf("XXXX: submitBatch DONE state %d\n", localRet);
} else if(localRet == RS_RET_SUSPENDED) {
; /* do nothing, this will retry the full batch */
} else if(localRet == RS_RET_ACTION_FAILED) {
@@ -913,10 +907,8 @@ dbgprintf("XXXX: submitBatch DONE state %d\n", localRet);
bDone = 1;
}
}
-dbgprintf("XXXX: submitBatch pre while state %d\n", localRet);
} while(!bDone); /* do .. while()! */
-dbgprintf("XXXX: END submitBatch elt 0 state %d, iRet %d\n", pBatch->pElem[0].state, iRet);
RETiRet;
}
@@ -1152,7 +1144,6 @@ actionWriteToAction(action_t *pAction)
* So let's enqueue our message for execution. -- rgerhards, 2007-07-24
*/
iRet = qqueueEnqObj(pAction->pQueue, pAction->f_pMsg->flowCtlType, (void*) MsgAddRef(pAction->f_pMsg));
-dbgprintf("XXXX: queueEnqObj returned %d\n", iRet);
if(iRet == RS_RET_OK)
pAction->f_prevcount = 0; /* message processed, so we start a new cycle */
diff --git a/configure.ac b/configure.ac
index 3fe27683..7d1b50b4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,6 +10,12 @@ AC_CONFIG_HEADERS([config.h])
AC_GNU_SOURCE
+# check for Java compiler
+AC_CHECK_PROG(HAVE_JAVAC, [javac], [yes])
+if test x"$HAVE_JAVAC" = x"yes"; then
+ AC_MSG_WARN([no javac found, disabling features depending on it])
+fi
+
# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
@@ -691,6 +697,11 @@ AC_ARG_ENABLE(testbench,
esac],
[enable_testbench=yes]
)
+if test "$enable_testbench" = "yes"; then
+ if test x$HAVE_JAVAC = x; then
+ enable_testbench='no'
+ fi
+fi
AM_CONDITIONAL(ENABLE_TESTBENCH, test x$enable_testbench = xyes)
diff --git a/doc/rsyslog_ng_comparison.html b/doc/rsyslog_ng_comparison.html
index 8e121a8d..7d12a4a7 100644
--- a/doc/rsyslog_ng_comparison.html
+++ b/doc/rsyslog_ng_comparison.html
@@ -5,6 +5,10 @@
<h1>rsyslog vs. syslog-ng</h1>
<p><small><i>Written by <a href="http://www.gerhards.net/rainer">Rainer Gerhards</a>
(2008-05-06)</i></small></p>
+<p><i>Warning</i>: this comparison is a little outdated, take it with a grain
+of salt and be sure to check the links at the bottom (both syslog-ng as well as
+rsyslog features are missing, but our priority is on creating great software not
+continously updating this comparison ;)).
<p>We have often been asked about a comparison sheet between
rsyslog and syslog-ng. Unfortunately, I do not know much about
syslog-ng, I did not even use it once. Also, there seems to be no
@@ -81,9 +85,10 @@ optional input</td>
</tr>
<tr>
<td valign="top">Windows Event Log</td>
-<td valign="top">via <a href="http://www.eventreporter.com">EventReporter</a>
+<td valign="top">via a Windows event logging software such as
+<a href="http://www.eventreporter.com">EventReporter</a>
or <a href="http://www.mwagent.com">MonitorWare Agent</a>
-(both commercial software)</td>
+(both commercial software, both fund rsyslog development)</td>
<td valign="top">via separate Windows agent, paid
edition only</td>
</tr>
diff --git a/runtime/msg.h b/runtime/msg.h
index 98b3599a..b006cbec 100644
--- a/runtime/msg.h
+++ b/runtime/msg.h
@@ -192,6 +192,23 @@ uchar *propIDToName(propid_t propID);
extern void (*funcMsgPrepareEnqueue)(msg_t *pMsg);
#define MsgPrepareEnqueue(pMsg) funcMsgPrepareEnqueue(pMsg)
+
+/* ------------------------------ some inline functions ------------------------------ */
+
+/* set raw message size. This is needed in some cases where a trunctation is necessary
+ * but the raw message must not be newly set. The most important (and currently only)
+ * use case is if we remove trailing LF or NUL characters. Note that the size can NOT
+ * be extended, only shrunk!
+ * rgerhards, 2009-08-26
+ */
+static inline void
+MsgSetRawMsgSize(msg_t *pMsg, size_t newLen)
+{
+ assert(newLen <= (size_t) pMsg->iLenRawMsg);
+ pMsg->iLenRawMsg = newLen;
+}
+
+
#endif /* #ifndef MSG_H_INCLUDED */
/* vim:set ai:
*/
diff --git a/runtime/parser.c b/runtime/parser.c
index a2538fa3..db11ac5b 100644
--- a/runtime/parser.c
+++ b/runtime/parser.c
@@ -163,6 +163,7 @@ sanitizeMessage(msg_t *pMsg)
size_t iDst;
size_t iMaxLine;
size_t maxDest;
+ bool bUpdatedLen = FALSE;
uchar szSanBuf[32*1024]; /* buffer used for sanitizing a string */
assert(pMsg != NULL);
@@ -177,6 +178,7 @@ sanitizeMessage(msg_t *pMsg)
/* remove NUL character at end of message (see comment in function header) */
if(pszMsg[lenMsg-1] == '\0') {
DBGPRINTF("dropped NUL at very end of message\n");
+ bUpdatedLen = TRUE;
lenMsg--;
}
@@ -187,6 +189,7 @@ sanitizeMessage(msg_t *pMsg)
*/
if(bDropTrailingLF && pszMsg[lenMsg-1] == '\n') {
DBGPRINTF("dropped LF at very end of message (DropTrailingLF is set)\n");
+ bUpdatedLen = TRUE;
lenMsg--;
}
@@ -197,7 +200,7 @@ sanitizeMessage(msg_t *pMsg)
*/
int bNeedSanitize = 0;
for(iSrc = 0 ; iSrc < lenMsg ; iSrc++) {
- if(pszMsg[iSrc] < 32) {
+ if(iscntrl(pszMsg[iSrc])) {
if(pszMsg[iSrc] == '\0' || bEscapeCCOnRcv) {
bNeedSanitize = 1;
break;
@@ -205,8 +208,11 @@ sanitizeMessage(msg_t *pMsg)
}
}
- if(!bNeedSanitize)
+ if(!bNeedSanitize) {
+ if(bUpdatedLen == TRUE)
+ MsgSetRawMsgSize(pMsg, lenMsg);
FINALIZE;
+ }
/* now copy over the message and sanitize it */
iMaxLine = glbl.GetMaxLine();
@@ -219,8 +225,10 @@ sanitizeMessage(msg_t *pMsg)
CHKmalloc(pDst = malloc(sizeof(uchar) * (iMaxLine + 1)));
iSrc = iDst = 0;
while(iSrc < lenMsg && iDst < maxDest - 3) { /* leave some space if last char must be escaped */
- if(pszMsg[iSrc] == '\0') { /* guard against \0 characters... */
- } else if(iscntrl((int) pszMsg[iSrc])) {
+ if(iscntrl((int) pszMsg[iSrc])) {
+ /* note: \0 must always be escaped, the rest of the code currently
+ * can not handle it! -- rgerhards, 2009-08-26
+ */
if(pszMsg[iSrc] == '\0' || bEscapeCCOnRcv) {
/* we are configured to escape control characters. Please note
* that this most probably break non-western character sets like
diff --git a/runtime/prop.c b/runtime/prop.c
index 804f3491..d188b2ed 100644
--- a/runtime/prop.c
+++ b/runtime/prop.c
@@ -174,7 +174,7 @@ rsRetVal CreateOrReuseStringProp(prop_t **ppThis, uchar *psz, int len)
} else {
/* already exists, check if we can re-use it */
GetString(*ppThis, &pszPrev, &lenPrev);
- if(len != lenPrev && ustrcmp(psz, pszPrev)) {
+ if(len != lenPrev || ustrcmp(psz, pszPrev)) {
/* different, need to discard old & create new one */
propDestruct(ppThis);
CHKiRet(CreateStringProp(ppThis, psz, len));
diff --git a/runtime/queue.c b/runtime/queue.c
index 8388d00e..cb14b58d 100644
--- a/runtime/queue.c
+++ b/runtime/queue.c
@@ -1044,7 +1044,6 @@ static rsRetVal qAddDirect(qqueue_t *pThis, void* pUsr)
iRet = pThis->pConsumer(pThis->pUsr, &singleBatch);
objDestruct(pUsr);
-dbgprintf("XXXX: qAddDirect returns %d\n", iRet);
RETiRet;
}
@@ -2443,7 +2442,6 @@ doEnqSingleObj(qqueue_t *pThis, flowControl_t flowCtlType, void *pUsr)
CHKiRet(qqueueAdd(pThis, pUsr));
finalize_it:
-dbgprintf("XXXX: queueEnqObj returns %d\n", iRet);
RETiRet;
}
diff --git a/runtime/rule.c b/runtime/rule.c
index bcd82e5f..182d616a 100644
--- a/runtime/rule.c
+++ b/runtime/rule.c
@@ -83,7 +83,6 @@ DEFFUNC_llExecFunc(processMsgDoActions)
}
iRetMod = actionCallAction(pAction, pDoActData->pMsg);
-dbgprintf("XXXX: processMsgDoActions returns %d\n", iRet);
if(iRetMod == RS_RET_DISCARDMSG) {
ABORT_FINALIZE(RS_RET_DISCARDMSG);
} else if(iRetMod == RS_RET_SUSPENDED) {
@@ -272,7 +271,6 @@ processMsg(rule_t *pThis, msg_t *pMsg)
}
finalize_it:
-dbgprintf("XXXX: rule.processMsg returns %d\n", iRet);
RETiRet;
}
diff --git a/runtime/ruleset.c b/runtime/ruleset.c
index c1b6d490..5ac9a8fd 100644
--- a/runtime/ruleset.c
+++ b/runtime/ruleset.c
@@ -141,7 +141,6 @@ DEFFUNC_llExecFunc(processMsgDoRules)
rsRetVal iRet;
ISOBJ_TYPE_assert(pData, rule);
iRet = rule.ProcessMsg((rule_t*) pData, (msg_t*) pParam);
-dbgprintf("XXXX: pcoessMsgDoRules returns %d\n", iRet);
return iRet;
}
@@ -162,7 +161,6 @@ processMsg(msg_t *pMsg)
CHKiRet(llExecFunc(&pThis->llRules, processMsgDoRules, pMsg));
finalize_it:
-dbgprintf("XXXX: processMsg got return state %d\n", iRet);
//if(iRet == RS_RET_DISCARDMSG)
//iRet = RS_RET_OK;