diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2009-08-27 14:18:30 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2009-08-27 14:18:30 +0200 |
commit | 63988ba095656ae0629a52a2ac8c2930ac4ddc20 (patch) | |
tree | d340ff31a2468e8b2ce38d8aa5738d0e362e2f8d | |
parent | ede0dbf1a3ee528f059903d4dfad96a91fe55186 (diff) | |
parent | fa9684d8c6faa8f2e808de9229b254d77844aa2c (diff) | |
download | rsyslog-63988ba095656ae0629a52a2ac8c2930ac4ddc20.tar.gz rsyslog-63988ba095656ae0629a52a2ac8c2930ac4ddc20.tar.xz rsyslog-63988ba095656ae0629a52a2ac8c2930ac4ddc20.zip |
Merge branch 'master' into java
-rw-r--r-- | ChangeLog | 30 | ||||
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | action.c | 9 | ||||
-rw-r--r-- | configure.ac | 11 | ||||
-rw-r--r-- | doc/rsyslog_ng_comparison.html | 9 | ||||
-rw-r--r-- | runtime/msg.h | 17 | ||||
-rw-r--r-- | runtime/parser.c | 16 | ||||
-rw-r--r-- | runtime/prop.c | 2 | ||||
-rw-r--r-- | runtime/queue.c | 2 | ||||
-rw-r--r-- | runtime/rule.c | 2 | ||||
-rw-r--r-- | runtime/ruleset.c | 2 |
11 files changed, 78 insertions, 23 deletions
@@ -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 # @@ -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; |