summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--grammar/rainerscript.c4
-rw-r--r--runtime/ruleset.c25
3 files changed, 30 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index fb8547c2..5e513507 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -15,6 +15,11 @@ 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.
----------------------------------------------------------------------------
Version 7.2.4 [v7-stable] 2012-12-07
- enhance: permit RFC3339 timestamp in local log socket messages
@@ -998,6 +1003,9 @@ Version 5.10.2 [V5-STABLE], 201?-??-??
Thanks to Marius Tomaschewski for the bug report and the patch idea.
- bugfix: invalid DST handling under Solaris
Thanks to Scott Severtson for the patch.
+- bugfix[kind of]: omudpspoof discarded messages >1472 bytes (MTU size)
+ it now truncates these message, but ensures they are sent. Note that
+ 7.2.5+ will switch to fragmented UDP messages instead (up to 64K)
---------------------------------------------------------------------------
Version 5.10.1 [V5-STABLE], 2012-10-17
- bugfix: imuxsock and imklog truncated head of received message
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 6b21bc9a..c5f2148e 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -1250,6 +1250,10 @@ evalStrArrayCmp(es_str_t *estr_l, struct cnfarray* ar, int cmpop)
} else if(expr->r->nodetype != 'A') { \
cnfexprEval(expr->r, &r, usrptr); \
estr_r = var2String(&r, &bMustFree); \
+ } else { \
+ /* Note: this is not really necessary, but if we do not */ \
+ /* do it, we get a very irritating compiler warning... */ \
+ estr_r = NULL; \
}
#define FREE_TWO_STRINGS \
diff --git a/runtime/ruleset.c b/runtime/ruleset.c
index 3459f545..b74f8ec8 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]) {
@@ -315,13 +317,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;
}
@@ -334,7 +339,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 = (msg_t*)(pBatch->pElem[i].pUsrp);
@@ -355,10 +362,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]) {