summaryrefslogtreecommitdiffstats
path: root/grammar
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2012-10-01 10:53:24 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2012-10-01 10:53:24 +0200
commitc5f9139c71d9d371dbdea4a3024c589820314ba8 (patch)
tree5b2f59bd40dcdac19e46659eee17795fbaf6e656 /grammar
parentc0ccd3ff253401ce2081a5d2042f50af35b07233 (diff)
downloadrsyslog-c5f9139c71d9d371dbdea4a3024c589820314ba8.tar.gz
rsyslog-c5f9139c71d9d371dbdea4a3024c589820314ba8.tar.xz
rsyslog-c5f9139c71d9d371dbdea4a3024c589820314ba8.zip
fix: invalid free in array-based string comparisons
Diffstat (limited to 'grammar')
-rw-r--r--grammar/rainerscript.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c
index 6f9310db..5638ba42 100644
--- a/grammar/rainerscript.c
+++ b/grammar/rainerscript.c
@@ -1229,9 +1229,9 @@ evalStrArrayCmp(es_str_t *estr_l, struct cnfarray* ar, int cmpop)
}
#define FREE_TWO_STRINGS \
- if(bMustFree) es_deleteStr(estr_r); \
- if(expr->r->nodetype != 'S' && r.datatype == 'S') es_deleteStr(r.d.estr); \
- if(bMustFree2) es_deleteStr(estr_l); \
+ if(bMustFree) es_deleteStr(estr_r); \
+ if(expr->r->nodetype != S_ARRAY && r.datatype == 'S') es_deleteStr(r.d.estr); \
+ if(bMustFree2) es_deleteStr(estr_l); \
if(l.datatype == 'S') es_deleteStr(l.d.estr)
/* evaluate an expression.
@@ -1479,6 +1479,7 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr)
ret->datatype = 'N';
if(expr->r->nodetype == S_ARRAY) {
ret->d.n = evalStrArrayCmp(estr_l, (struct cnfarray*) expr->r, CMP_STARTSWITH);
+ bMustFree = 0;
} else {
ret->d.n = es_strncmp(estr_l, estr_r, estr_r->lenStr) == 0;
}
@@ -1489,6 +1490,7 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr)
ret->datatype = 'N';
if(expr->r->nodetype == S_ARRAY) {
ret->d.n = evalStrArrayCmp(estr_l, (struct cnfarray*) expr->r, CMP_STARTSWITHI);
+ bMustFree = 0;
} else {
ret->d.n = es_strncasecmp(estr_l, estr_r, estr_r->lenStr) == 0;
}
@@ -1499,6 +1501,7 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr)
ret->datatype = 'N';
if(expr->r->nodetype == S_ARRAY) {
ret->d.n = evalStrArrayCmp(estr_l, (struct cnfarray*) expr->r, CMP_CONTAINS);
+ bMustFree = 0;
} else {
ret->d.n = es_strContains(estr_l, estr_r) != -1;
}
@@ -1509,6 +1512,7 @@ cnfexprEval(struct cnfexpr *expr, struct var *ret, void* usrptr)
ret->datatype = 'N';
if(expr->r->nodetype == S_ARRAY) {
ret->d.n = evalStrArrayCmp(estr_l, (struct cnfarray*) expr->r, CMP_CONTAINSI);
+ bMustFree = 0;
} else {
ret->d.n = es_strCaseContains(estr_l, estr_r) != -1;
}