summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog19
-rw-r--r--grammar/rainerscript.c10
-rw-r--r--plugins/im3195/im3195.c15
-rw-r--r--plugins/mmjsonparse/mmjsonparse.c1
-rw-r--r--runtime/datetime.c4
-rw-r--r--runtime/msg.c2
-rw-r--r--runtime/ruleset.c25
7 files changed, 62 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 2df723a1..341ae77d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -141,6 +141,25 @@ Version 7.2.5 [v7-stable] 2013-01-??
due to missing libmath. Thanks to Michael Biebl for the fix
- bugfix: invalid DST handling under Solaris
Thanks to Scott Severtson for the patch.
+- bugfix: on termination, actions were incorrectly called
+ The problem was that incomplete fiter evaluation was done *during the
+ shutdown phase*. This affected only the LAST batches being processed. No
+ problem existed during the regular run. Could usually only happen on
+ very busy systems, which were still busy during shutdown.
+- bugfix: very large memory consumption (and probably out of memory) when
+ FromPos was specified in template, but ToPos not.
+ Thanks to Radu Gheorghe for alerting us of this bug.
+- bugfix: timeval2syslogTime cause problems on some platforms
+ due to invalid assumption on structure data types.
+ closes: http://bugzilla.adiscon.com/show_bug.cgi?id=394
+ Thanks to David Hill for the patch [under ASL2.0 as per email conversation
+ 2013-01-03].
+- bugfix: compile errors in im3195
+ Thanks to Martin Körper for the patch
+- bugfix: doGetFileCreateMode() had invalid validity check ;)
+ Thanks to Chandler Latour for the patch.
+- bugfix: mmjsonparse errornously returned action error when no CEE cookie
+ was present.
----------------------------------------------------------------------------
Version 7.2.4 [v7-stable] 2012-12-07
- enhance: permit RFC3339 timestamp in local log socket messages
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 8eddf82f..8c79cc5d 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -614,17 +614,17 @@ doGetFileCreateMode(struct nvlst *valnode, struct cnfparamdescr *param,
if(es_strlen(valnode->val.d.estr) == 4) {
c = es_getBufAddr(valnode->val.d.estr);
- if(!( (c[0] == '0')
- && (c[1] >= '0' && c[1] <= '7')
- && (c[2] >= '0' && c[2] <= '7')
- && (c[3] >= '0' && c[3] <= '7') ) ) {
+ if( (c[0] == '0')
+ && (c[1] >= '0' && c[1] <= '7')
+ && (c[2] >= '0' && c[2] <= '7')
+ && (c[3] >= '0' && c[3] <= '7') ) {
fmtOK = 1;
}
}
if(fmtOK) {
val->val.datatype = 'N';
- val->val.d.n = (c[1]-'0') * 64 + (c[2]-'0') * 8 + (c[3]-'0');;
+ val->val.d.n = (c[1]-'0') * 64 + (c[2]-'0') * 8 + (c[3]-'0');
} else {
cstr = es_str2cstr(valnode->val.d.estr, NULL);
parser_errmsg("file modes need to be specified as "
diff --git a/plugins/im3195/im3195.c b/plugins/im3195/im3195.c
index c75e0e34..4b04b124 100644
--- a/plugins/im3195/im3195.c
+++ b/plugins/im3195/im3195.c
@@ -48,6 +48,7 @@
#include "cfsysline.h"
#include "msg.h"
#include "errmsg.h"
+#include "unicode-helper.h"
MODULE_TYPE_INPUT
MODULE_TYPE_NOKEEP
@@ -56,6 +57,7 @@ MODULE_CNFNAME("im3195")
/* Module static data */
DEF_IMOD_STATIC_DATA
DEFobjCurrIf(errmsg)
+DEFobjCurrIf(prop)
/* configuration settings */
@@ -71,6 +73,8 @@ static int listenPort = 601;
*/
static srAPIObj* pAPI;
+static prop_t *pInputName = NULL; /* there is only one global inputName for all messages generated by this module */
+
/* This method is called when a message has been fully received.
* It passes the received message to the rsyslog main message
@@ -90,7 +94,7 @@ void OnReceive(srAPIObj __attribute__((unused)) *pMyAPI, srSLMGObj* pSLMG)
srSLMGGetRawMSG(pSLMG, &pszRawMsg);
parseAndSubmitMessage(fromHost, fromHostIP, pszRawMsg, strlen((char*)pszRawMsg),
- PARSE_HOSTNAME, eFLOWCTL_FULL_DELAY, (uchar*)"im3195", NULL, 0, NULL);
+ PARSE_HOSTNAME, eFLOWCTL_FULL_DELAY, pInputName, NULL, 0, NULL);
}
@@ -171,6 +175,9 @@ ENDafterRun
BEGINmodExit
CODESTARTmodExit
srAPIExitLib(pAPI); /* terminate liblogging */
+ /* global variable cleanup */
+ if(pInputName != NULL)
+ prop.Destruct(&pInputName);
/* release objects we used */
objRelease(errmsg, CORE_COMPONENT);
ENDmodExit
@@ -193,9 +200,15 @@ CODESTARTmodInit
*ipIFVersProvided = CURR_MOD_IF_VERSION; /* we only support the current interface specification */
CODEmodInit_QueryRegCFSLineHdlr
CHKiRet(objUse(errmsg, CORE_COMPONENT));
+ CHKiRet(objUse(prop, CORE_COMPONENT));
CHKiRet(omsdRegCFSLineHdlr((uchar *)"input3195listenport", 0, eCmdHdlrInt, NULL, &listenPort, STD_LOADABLE_MODULE_ID));
CHKiRet(omsdRegCFSLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, STD_LOADABLE_MODULE_ID));
+
+ CHKiRet(prop.Construct(&pInputName));
+ CHKiRet(prop.SetString(pInputName, UCHAR_CONSTANT("im3195"), sizeof("im3195") - 1));
+ CHKiRet(prop.ConstructFinalize(pInputName));
+
ENDmodInit
/* vim:set ai:
*/
diff --git a/plugins/mmjsonparse/mmjsonparse.c b/plugins/mmjsonparse/mmjsonparse.c
index 053b8270..ce32b7b7 100644
--- a/plugins/mmjsonparse/mmjsonparse.c
+++ b/plugins/mmjsonparse/mmjsonparse.c
@@ -196,6 +196,7 @@ finalize_it:
jval = json_object_new_string((char*)buf);
json_object_object_add(json, "msg", jval);
msgAddJSON(pMsg, (uchar*)"!", json);
+ iRet = RS_RET_OK;
}
MsgSetParseSuccess(pMsg, bSuccess);
ENDdoAction
diff --git a/runtime/datetime.c b/runtime/datetime.c
index c03abab9..7d974471 100644
--- a/runtime/datetime.c
+++ b/runtime/datetime.c
@@ -61,8 +61,10 @@ timeval2syslogTime(struct timeval *tp, struct syslogTime *t)
struct tm *tm;
struct tm tmBuf;
long lBias;
+ time_t secs;
- tm = localtime_r((time_t*) &(tp->tv_sec), &tmBuf);
+ secs = tp->tv_sec;
+ tm = localtime_r(&secs, &tmBuf);
t->year = tm->tm_year + 1900;
t->month = tm->tm_mon + 1;
diff --git a/runtime/msg.c b/runtime/msg.c
index 86805af1..cf72892e 100644
--- a/runtime/msg.c
+++ b/runtime/msg.c
@@ -3218,6 +3218,8 @@ uchar *MsgGetProp(msg_t *pMsg, struct templateEntry *pTpe,
*/
; /*DO NOTHING*/
} else {
+ if(iTo > bufLen) /* iTo is very large, if no to-position is set in the template! */
+ iTo = bufLen;
iLen = iTo - iFrom + 1; /* the +1 is for an actual char, NOT \0! */
pBufStart = pBuf = MALLOC((iLen + 1) * sizeof(char));
if(pBuf == NULL) {
diff --git a/runtime/ruleset.c b/runtime/ruleset.c
index c8cb87fd..21c3c337 100644
--- a/runtime/ruleset.c
+++ b/runtime/ruleset.c
@@ -299,7 +299,9 @@ execIf(struct cnfstmt *stmt, batch_t *pBatch, sbool *active)
sbool bRet;
DEFiRet;
newAct = newActive(pBatch);
- for(i = 0 ; i < batchNumMsgs(pBatch) && !*(pBatch->pbShutdownImmediate) ; ++i) {
+ for(i = 0 ; i < batchNumMsgs(pBatch) ; ++i) {
+ if(*(pBatch->pbShutdownImmediate))
+ FINALIZE;
if(pBatch->pElem[i].state == BATCH_STATE_DISC)
continue; /* will be ignored in any case */
if(active == NULL || active[i]) {
@@ -314,13 +316,16 @@ execIf(struct cnfstmt *stmt, batch_t *pBatch, sbool *active)
scriptExec(stmt->d.s_if.t_then, pBatch, newAct);
}
if(stmt->d.s_if.t_else != NULL) {
- for(i = 0 ; i < batchNumMsgs(pBatch) && !*(pBatch->pbShutdownImmediate)
- ; ++i)
+ for(i = 0 ; i < batchNumMsgs(pBatch) ; ++i) {
+ if(*(pBatch->pbShutdownImmediate))
+ FINALIZE;
if(pBatch->pElem[i].state != BATCH_STATE_DISC)
newAct[i] = !newAct[i];
+ }
scriptExec(stmt->d.s_if.t_else, pBatch, newAct);
}
freeActive(newAct);
+finalize_it:
RETiRet;
}
@@ -333,7 +338,9 @@ execPRIFILT(struct cnfstmt *stmt, batch_t *pBatch, sbool *active)
int bRet;
int i;
newAct = newActive(pBatch);
- for(i = 0 ; i < batchNumMsgs(pBatch) && !*(pBatch->pbShutdownImmediate) ; ++i) {
+ for(i = 0 ; i < batchNumMsgs(pBatch) ; ++i) {
+ if(*(pBatch->pbShutdownImmediate))
+ return;
if(pBatch->pElem[i].state == BATCH_STATE_DISC)
continue; /* will be ignored in any case */
pMsg = pBatch->pElem[i].pMsg;
@@ -354,10 +361,12 @@ execPRIFILT(struct cnfstmt *stmt, batch_t *pBatch, sbool *active)
scriptExec(stmt->d.s_prifilt.t_then, pBatch, newAct);
}
if(stmt->d.s_prifilt.t_else != NULL) {
- for(i = 0 ; i < batchNumMsgs(pBatch) && !*(pBatch->pbShutdownImmediate)
- ; ++i)
+ for(i = 0 ; i < batchNumMsgs(pBatch) ; ++i) {
+ if(*(pBatch->pbShutdownImmediate))
+ return;
if(pBatch->pElem[i].state != BATCH_STATE_DISC)
newAct[i] = !newAct[i];
+ }
scriptExec(stmt->d.s_prifilt.t_else, pBatch, newAct);
}
freeActive(newAct);
@@ -461,7 +470,9 @@ execPROPFILT(struct cnfstmt *stmt, batch_t *pBatch, sbool *active)
sbool bRet;
int i;
thenAct = newActive(pBatch);
- for(i = 0 ; i < batchNumMsgs(pBatch) && !*(pBatch->pbShutdownImmediate) ; ++i) {
+ for(i = 0 ; i < batchNumMsgs(pBatch) ; ++i) {
+ if(*(pBatch->pbShutdownImmediate))
+ return;
if(pBatch->pElem[i].state == BATCH_STATE_DISC)
continue; /* will be ignored in any case */
if(active == NULL || active[i]) {