Print this page
11506 smatch resync


 274         }
 275         return 0;
 276 }
 277 
 278 int parent_is_free_strict(struct expression *expr)
 279 {
 280         struct symbol *sym;
 281         char *var;
 282         int ret = 0;
 283 
 284         expr = strip_expr(expr);
 285         var = expr_to_var_sym(expr, &sym);
 286         if (!var || !sym)
 287                 goto free;
 288         ret = parent_is_free_var_sym_strict(var, sym);
 289 free:
 290         free_string(var);
 291         return ret;
 292 }
 293 
































 294 void check_free_strict(int id)
 295 {
 296         my_id = id;
 297 
 298         if (option_project != PROJ_KERNEL)
 299                 return;
 300 
 301         add_function_hook("kfree", &match_free, INT_PTR(0));
 302         add_function_hook("kmem_cache_free", &match_free, INT_PTR(1));
 303 
 304         if (option_spammy)
 305                 add_hook(&match_symbol, SYM_HOOK);
 306         add_hook(&match_dereferences, DEREF_HOOK);
 307         add_hook(&match_call, FUNCTION_CALL_HOOK);
 308         add_hook(&match_return, RETURN_HOOK);
 309 
 310         add_modification_hook_late(my_id, &ok_to_use);
 311         add_pre_merge_hook(my_id, &pre_merge_hook);
 312 
 313         select_return_states_hook(PARAM_FREED, &set_param_freed);

 314 }


 274         }
 275         return 0;
 276 }
 277 
 278 int parent_is_free_strict(struct expression *expr)
 279 {
 280         struct symbol *sym;
 281         char *var;
 282         int ret = 0;
 283 
 284         expr = strip_expr(expr);
 285         var = expr_to_var_sym(expr, &sym);
 286         if (!var || !sym)
 287                 goto free;
 288         ret = parent_is_free_var_sym_strict(var, sym);
 289 free:
 290         free_string(var);
 291         return ret;
 292 }
 293 
 294 static void match_untracked(struct expression *call, int param)
 295 {
 296         struct state_list *slist = NULL;
 297         struct expression *arg;
 298         struct sm_state *sm;
 299         char *name;
 300         char buf[64];
 301         int len;
 302 
 303         arg = get_argument_from_call_expr(call->args, param);
 304         if (!arg)
 305                 return;
 306 
 307         name = expr_to_var(arg);
 308         if (!name)
 309                 return;
 310         snprintf(buf, sizeof(buf), "%s->", name);
 311         free_string(name);
 312         len = strlen(buf);
 313 
 314         FOR_EACH_MY_SM(my_id, __get_cur_stree(), sm) {
 315                 if (strncmp(sm->name, buf, len) == 0)
 316                         add_ptr_list(&slist, sm);
 317         } END_FOR_EACH_SM(sm);
 318 
 319         FOR_EACH_PTR(slist, sm) {
 320                 set_state(sm->owner, sm->name, sm->sym, &ok);
 321         } END_FOR_EACH_PTR(sm);
 322 
 323         free_slist(&slist);
 324 }
 325 
 326 void check_free_strict(int id)
 327 {
 328         my_id = id;
 329 
 330         if (option_project != PROJ_KERNEL)
 331                 return;
 332 
 333         add_function_hook("kfree", &match_free, INT_PTR(0));
 334         add_function_hook("kmem_cache_free", &match_free, INT_PTR(1));
 335 
 336         if (option_spammy)
 337                 add_hook(&match_symbol, SYM_HOOK);
 338         add_hook(&match_dereferences, DEREF_HOOK);
 339         add_hook(&match_call, FUNCTION_CALL_HOOK);
 340         add_hook(&match_return, RETURN_HOOK);
 341 
 342         add_modification_hook_late(my_id, &ok_to_use);
 343         add_pre_merge_hook(my_id, &pre_merge_hook);
 344 
 345         select_return_states_hook(PARAM_FREED, &set_param_freed);
 346         add_untracked_param_hook(&match_untracked);
 347 }