summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-04-04 10:07:49 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2013-04-04 10:07:49 +0200
commitcbf0ed9541fee2a480dda3533d1604a9df4ae9bb (patch)
tree3b85720084657247302e7e22537c20ca37482ad3
parentd1caf0e291f0fb587781436f3f634749f761ea03 (diff)
downloadrsyslog-cbf0ed9541fee2a480dda3533d1604a9df4ae9bb.tar.gz
rsyslog-cbf0ed9541fee2a480dda3533d1604a9df4ae9bb.tar.bz2
rsyslog-cbf0ed9541fee2a480dda3533d1604a9df4ae9bb.zip
bugfix: script == comparison did not work properly on JSON objects
backport from 7.3 branch
-rw-r--r--ChangeLog2
-rw-r--r--grammar/rainerscript.c23
2 files changed, 25 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 405e8b18..39b5a8ef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,8 @@ Version 7.2.7 [v7-stable] 2013-03-??
The rsyslog debug log file is now continued to be written across the
fork.
- updated systemd files to match current systemd source
+- bugfix: script == comparison did not work properly on JSON objects
+ [backport from 7.3 branch]
- bugfix: imudp scheduling parameters did affect main thread, not imudp
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=409
- bugfix: imuxsock rate-limiting could not be configured via legacy conf
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index b04e53b5..c14295af 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -1317,6 +1317,29 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr)
}
if(r.datatype == 'S') es_deleteStr(r.d.estr);
}
+ } else if(l.datatype == 'J') {
+ estr_l = var2String(&l, &bMustFree);
+ if(expr->r->nodetype == 'S') {
+ ret->d.n = !es_strcmp(estr_l, ((struct cnfstringval*)expr->r)->estr); /*CMP*/
+ } else if(expr->r->nodetype == 'A') {
+ ret->d.n = evalStrArrayCmp(estr_l, (struct cnfarray*) expr->r, CMP_EQ);
+ } else {
+ cnfexprEval(expr->r, &r, usrptr);
+ if(r.datatype == 'S') {
+ ret->d.n = !es_strcmp(estr_l, r.d.estr); /*CMP*/
+ } else {
+ n_l = var2Number(&l, &convok_l);
+ if(convok_l) {
+ ret->d.n = (n_l == r.d.n); /*CMP*/
+ } else {
+ estr_r = var2String(&r, &bMustFree);
+ ret->d.n = !es_strcmp(estr_l, estr_r); /*CMP*/
+ if(bMustFree) es_deleteStr(estr_r);
+ }
+ }
+ if(r.datatype == 'S') es_deleteStr(r.d.estr);
+ }
+ if(bMustFree) es_deleteStr(estr_l);
} else {
cnfexprEval(expr->r, &r, usrptr);
if(r.datatype == 'S') {