void check_freeing_null(int id) { my_id = id; if (!option_spammy) return; if (option_project == PROJ_KERNEL) add_function_hook("kfree", &match_free, NULL); else add_function_hook("free", &match_free, NULL); }
void check_held_dev(int id) { if (option_project != PROJ_KERNEL) return; my_id = id; add_function_hook("dev_hold", &match_dev_hold, NULL); add_function_hook("dev_put", &match_dev_put, NULL); register_returns_held_funcs(); add_hook(&match_return, RETURN_HOOK); }
static void register_no_return_funcs(void) { struct token *token; const char *func; char name[256]; if (option_project == PROJ_NONE) strcpy(name, "no_return_funcs"); else snprintf(name, 256, "%s.no_return_funcs", option_project_str); token = get_tokens_file(name); if (!token) return; if (token_type(token) != TOKEN_STREAMBEGIN) return; token = token->next; while (token_type(token) != TOKEN_STREAMEND) { if (token_type(token) != TOKEN_IDENT) return; func = show_ident(token->ident); add_function_hook(func, &__match_nullify_path_hook, NULL); token = token->next; } clear_token_alloc(); }
static void register_funcs_from_file(void) { struct token *token; const char *func; int arg; token = get_tokens_file("kernel.dma_funcs"); if (!token) return; if (token_type(token) != TOKEN_STREAMBEGIN) return; token = token->next; while (token_type(token) != TOKEN_STREAMEND) { if (token_type(token) != TOKEN_IDENT) return; func = show_ident(token->ident); token = token->next; if (token_type(token) != TOKEN_NUMBER) return; arg = atoi(token->number); add_function_hook(func, &match_dma_func, INT_PTR(arg)); token = token->next; } clear_token_alloc(); }
void check_ns_capable(int id) { if (option_project != PROJ_KERNEL) return; ns_capable_id = id; add_function_hook("ns_capable", &match_ns_capable, INT_PTR(0)); select_caller_info_hook(set_db_ns_capable, NS_CAPABLE); }
void check_bit_shift(int id) { my_id = id; shifters = create_function_hashtable(5000); register_shifters(); add_hook(&match_assign, ASSIGNMENT_HOOK); add_hook(&match_binop, BINOP_HOOK); if (option_info) { add_hook(&match_binop_info, BINOP_HOOK); if (option_project == PROJ_KERNEL) { add_function_hook("set_bit", &match_call, INT_PTR(0)); add_function_hook("test_bit", &match_call, INT_PTR(0)); } } }
void check_capable(int id) { if (option_project != PROJ_KERNEL) return; capable_id = id; add_function_hook("capable", &match_capable, INT_PTR(0)); add_hook(&save_call_info, FUNCTION_CALL_HOOK); add_split_return_callback(save_return_info); select_caller_info_hook(set_db_capable, CAPABLE); }
void check_resource_size(int id) { my_id = id; if (option_project != PROJ_KERNEL) return; add_function_hook("ioremap_nocache", &match_resource, (void *)1); add_function_hook("ioremap", &match_resource, (void *)1); add_function_hook("__request_region", &match_resource, (void *)2); add_function_hook("__release_region", &match_resource, (void *)2); add_function_hook("__devm_request_region", &match_resource, (void *)3); add_function_hook("__devm_release_region", &match_resource, (void *)3); }
void check_strcpy_overflow(int id) { add_function_hook("strcpy", &match_strcpy, NULL); }