projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
perf metric: Fix memory leak in expr__add_id function
[linux-2.6-microblaze.git]
/
tools
/
perf
/
util
/
expr.c
diff --git
a/tools/perf/util/expr.c
b/tools/perf/util/expr.c
index
f64ab91
..
578a173
100644
(file)
--- a/
tools/perf/util/expr.c
+++ b/
tools/perf/util/expr.c
@@
-1,6
+1,9
@@
// SPDX-License-Identifier: GPL-2.0
#include <stdbool.h>
#include <assert.h>
// SPDX-License-Identifier: GPL-2.0
#include <stdbool.h>
#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
#include "expr.h"
#include "expr-bison.h"
#include "expr-flex.h"
#include "expr.h"
#include "expr-bison.h"
#include "expr-flex.h"
@@
-30,32
+33,34
@@
static bool key_equal(const void *key1, const void *key2,
}
/* Caller must make sure id is allocated */
}
/* Caller must make sure id is allocated */
-int expr__add_id
(struct expr_parse_ctx *ctx, const char *name
, double val)
+int expr__add_id
_val(struct expr_parse_ctx *ctx, const char *id
, double val)
{
{
-
double *val_ptr = NULL, *old_val
= NULL;
+
struct expr_id_data *data_ptr = NULL, *old_data
= NULL;
char *old_key = NULL;
int ret;
if (val != 0.0) {
char *old_key = NULL;
int ret;
if (val != 0.0) {
-
val_ptr = malloc(sizeof(double
));
- if (!
val
_ptr)
+
data_ptr = malloc(sizeof(*data_ptr
));
+ if (!
data
_ptr)
return -ENOMEM;
return -ENOMEM;
-
*val_ptr
= val;
+
data_ptr->val
= val;
}
}
- ret = hashmap__set(&ctx->ids, name, val_ptr,
- (const void **)&old_key, (void **)&old_val);
+ ret = hashmap__set(&ctx->ids, id, data_ptr,
+ (const void **)&old_key, (void **)&old_data);
+ if (ret)
+ free(data_ptr);
free(old_key);
free(old_key);
- free(old_
val
);
+ free(old_
data
);
return ret;
}
int expr__get_id(struct expr_parse_ctx *ctx, const char *id, double *val_ptr)
{
return ret;
}
int expr__get_id(struct expr_parse_ctx *ctx, const char *id, double *val_ptr)
{
-
double
*data;
+
struct expr_id_data
*data;
if (!hashmap__find(&ctx->ids, id, (void **)&data))
return -1;
if (!hashmap__find(&ctx->ids, id, (void **)&data))
return -1;
- *val_ptr = (data == NULL) ? 0.0 :
*data
;
+ *val_ptr = (data == NULL) ? 0.0 :
data->val
;
return 0;
}
return 0;
}
@@
-116,7
+121,7
@@
int expr__parse(double *final_val, struct expr_parse_ctx *ctx,
int expr__find_other(const char *expr, const char *one,
struct expr_parse_ctx *ctx, int runtime)
{
int expr__find_other(const char *expr, const char *one,
struct expr_parse_ctx *ctx, int runtime)
{
-
double
*old_val = NULL;
+
struct expr_id_data
*old_val = NULL;
char *old_key = NULL;
int ret = __expr__parse(NULL, ctx, expr, EXPR_OTHER, runtime);
char *old_key = NULL;
int ret = __expr__parse(NULL, ctx, expr, EXPR_OTHER, runtime);