1
0
mirror of https://github.com/Llewellynvdm/conky.git synced 2024-11-15 09:44:04 +00:00

Fix memleak in if_match

This commit is contained in:
Nikolas Garofil 2010-02-17 20:34:53 +01:00
parent b1a07a1750
commit 597586f289

View File

@ -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,16 +237,22 @@ int compare(const char *expr)
idx = scompare(a, mtype, b);
free(a);
free(b);
free(expr_dup);
return idx;
}
case ARG_LONG:
return lcompare(arg_to_long(expr_dup), 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, mtype, lng_b);
case ARG_DOUBLE:
return dcompare(arg_to_double(expr_dup), 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 lcompare(dbl_a, mtype, dbl_b);
case ARG_BAD: /* make_gcc_happy() */;
}
/* not reached */
free(expr_dup);
return -2;
}