From a1a73c23cb09bf1083b0b4f905413d66aeb0d2c3 Mon Sep 17 00:00:00 2001 From: Nikolas Garofil Date: Wed, 17 Feb 2010 20:26:50 +0100 Subject: [PATCH] Fix memleak in if_match --- src/algebra.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/algebra.cc b/src/algebra.cc index 7e306525..a4ae3656 100644 --- a/src/algebra.cc +++ b/src/algebra.cc @@ -195,6 +195,8 @@ int compare(const char *expr) char *expr_dup; int idx, mtype; enum arg_type type1, type2; + long lng_a, lng_b; + double dbl_a, dbl_b; idx = find_match_op(expr); mtype = get_match_type(expr); @@ -213,6 +215,7 @@ int compare(const char *expr) type2 = get_arg_type(expr_dup + idx + 1); if (type1 == ARG_BAD || type2 == ARG_BAD) { NORM_ERR("Bad arguments: '%s' and '%s'", expr_dup, (expr_dup + idx + 1)); + free(expr_dup); return -2; } if (type1 == ARG_LONG && type2 == ARG_DOUBLE) @@ -222,6 +225,7 @@ int compare(const char *expr) if (type1 != type2) { NORM_ERR("trying to compare args '%s' and '%s' of different type", expr_dup, (expr_dup + idx + 1)); + free(expr_dup); return -2; } switch (type1) { @@ -233,17 +237,23 @@ int compare(const char *expr) idx = scompare(a, (enum match_type) mtype, b); free(a); free(b); + free(expr_dup); return idx; } case ARG_LONG: - return lcompare(arg_to_long(expr_dup), (enum match_type) mtype, - arg_to_long(expr_dup + idx + 1)); + lng_a = arg_to_long(expr_dup); + lng_b = arg_to_long(expr_dup + idx + 1); + free(expr_dup); + return lcompare(lng_a, (enum match_type) mtype, lng_b); case ARG_DOUBLE: - return dcompare(arg_to_double(expr_dup), (enum match_type) mtype, - arg_to_double(expr_dup + idx + 1)); + dbl_a = arg_to_double(expr_dup); + dbl_b = arg_to_double(expr_dup + idx + 1); + free(expr_dup); + return dcompare(dbl_a, (enum match_type) mtype, dbl_b); case ARG_BAD: /* make_gcc_happy() */; } /* not reached */ + free(expr_dup); return -2; }