diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2012-10-01 10:53:24 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2012-10-01 10:53:24 +0200 |
commit | c5f9139c71d9d371dbdea4a3024c589820314ba8 (patch) | |
tree | 5b2f59bd40dcdac19e46659eee17795fbaf6e656 /grammar | |
parent | c0ccd3ff253401ce2081a5d2042f50af35b07233 (diff) | |
download | rsyslog-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.c | 10 |
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; } |