From abbd0aab15b228cf159e50f55dc20f195e31779c Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Fri, 28 Jul 2023 12:55:35 +0300 Subject: [PATCH] function_hooks: introduce return_implies_param_key_expr() This is like return_implies_param_key() but instead of giving you a name/sym, it gives you an expression pointer. I also fixed kernel_task_state_info using this so that now it handles prepare_to_wait_event() correctly. Signed-off-by: Dan Carpenter --- smatch.h | 3 +++ smatch_function_hooks.c | 36 ++++++++++++++++++++++++++++++++++-- smatch_kernel_task_state_info.c | 6 ++++-- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/smatch.h b/smatch.h index 123c4b49..683b2965 100644 --- a/smatch.h +++ b/smatch.h @@ -256,6 +256,9 @@ void return_implies_param_key(const char *look_for, sval_t start, sval_t end, void return_implies_param_key_exact(const char *look_for, sval_t start, sval_t end, param_key_hook *call_back, int param, const char *key, void *info); +void return_implies_param_key_expr(const char *look_for, sval_t start, sval_t end, + expr_func *call_back, + int param, const char *key, void *info); void select_return_param_key(int type, param_key_hook *callback); bool get_implied_return(struct expression *expr, struct range_list **rl); void allocate_hook_memory(void); diff --git a/smatch_function_hooks.c b/smatch_function_hooks.c index 23110f70..7f06178f 100644 --- a/smatch_function_hooks.c +++ b/smatch_function_hooks.c @@ -41,6 +41,7 @@ * * Just for some return ranges: * return_implies_param_key() + * return_implies_param_key_expr() * return_implies_param_key_exact() * return_implies_state() * select_return_param_key() (It's weird that this is not in smatch_db.c) @@ -363,6 +364,18 @@ static void param_key_implies_function(const char *fn, struct expression *call_e db_helper(assign_expr ?: call_expr, pkd->call_back, pkd->param, pkd->key, pkd->info); } +static void param_key_expr_implies_function(const char *fn, struct expression *call_expr, + struct expression *assign_expr, void *data) +{ + struct param_key_data *pkd = data; + struct expression *arg; + + arg = gen_expr_from_param_key(assign_expr ?: call_expr, pkd->param, pkd->key); + if (!arg) + return; + pkd->expr_fn(arg); +} + static struct param_key_data *alloc_pkd(param_key_hook *call_back, int param, const char *key, void *info) { struct param_key_data *pkd; @@ -376,6 +389,16 @@ static struct param_key_data *alloc_pkd(param_key_hook *call_back, int param, co return pkd; } +static struct param_key_data *alloc_pked(expr_func *call_back, int param, const char *key, void *info) +{ + struct param_key_data *pkd; + + pkd = alloc_pkd(NULL, param, key, info); + pkd->expr_fn = call_back; + + return pkd; +} + void add_function_param_key_hook_early(const char *look_for, param_key_hook *call_back, int param, const char *key, void *info) { @@ -407,8 +430,7 @@ void add_param_key_expr_hook(const char *look_for, expr_func *call_back, { struct param_key_data *pkd; - pkd = alloc_pkd(NULL, param, key, info); - pkd->expr_fn = call_back; + pkd = alloc_pked(call_back, param, key, info); if (param == -1) add_function_assign_hook(look_for, ¶m_key_expr_function, pkd); @@ -445,6 +467,16 @@ void return_implies_param_key_exact(const char *look_for, sval_t start, sval_t e return_implies_exact(look_for, start, end, ¶m_key_implies_function, pkd); } +void return_implies_param_key_expr(const char *look_for, sval_t start, sval_t end, + expr_func *call_back, + int param, const char *key, void *info) +{ + struct param_key_data *pkd; + + pkd = alloc_pked(call_back, param, key, info); + return_implies_state_sval(look_for, start, end, ¶m_key_expr_implies_function, pkd); +} + void add_macro_assign_hook(const char *look_for, func_hook *call_back, void *info) { diff --git a/smatch_kernel_task_state_info.c b/smatch_kernel_task_state_info.c index 75d26a6c..82fc9130 100644 --- a/smatch_kernel_task_state_info.c +++ b/smatch_kernel_task_state_info.c @@ -35,7 +35,7 @@ struct state_param { }; static struct state_param func_table[] = { - { "prepare_to_wait_event", 0, 2, "$"}, + { "prepare_to_wait_event", 0, 2, "$", &int_zero, &int_zero}, { "finish_wait", TASK_RUNNING }, }; @@ -145,7 +145,9 @@ void register_kernel_task_state_info(int id) else if (info->type == TASK_NOT_RUNNING) add_function_hook(info->name, &match_not_running, info); else - add_param_key_expr_hook(info->name, &do_set_current_state, + return_implies_param_key_expr(info->name, + *info->implies_start, *info->implies_end, + &do_set_current_state, info->param, info->key, info); } } -- 2.11.4.GIT