177 static void release_function_indicator(const char *name)
178 {
179 if (!option_info)
180 return;
181 add_function_hook(name, &print_unwind_functions, INT_PTR(0));
182 }
183
184 void check_unwind(int id)
185 {
186 if (option_project != PROJ_KERNEL || !option_spammy)
187 return;
188 my_id = id;
189
190 register_unwind_functions();
191
192 return_implies_state("request_resource", 0, 0, &request_granted, INT_PTR(1));
193 return_implies_state("request_resource", -EBUSY, -EBUSY, &request_denied, INT_PTR(1));
194 add_function_hook("release_resource", &match_release, INT_PTR(0));
195 release_function_indicator("release_resource");
196
197 return_implies_state("__request_region", valid_ptr_min, valid_ptr_max, &request_granted, INT_PTR(1));
198 return_implies_state("__request_region", 0, 0, &request_denied, INT_PTR(1));
199 add_function_hook("__release_region", &match_release, INT_PTR(1));
200 release_function_indicator("__release_region");
201
202 return_implies_state("ioremap", valid_ptr_min, valid_ptr_max, &request_granted, INT_PTR(-1));
203 return_implies_state("ioremap", 0, 0, &request_denied, INT_PTR(-1));
204 add_function_hook("iounmap", &match_release, INT_PTR(0));
205
206 return_implies_state("pci_iomap", valid_ptr_min, valid_ptr_max, &request_granted, INT_PTR(-1));
207 return_implies_state("pci_iomap", 0, 0, &request_denied, INT_PTR(-1));
208 add_function_hook("pci_iounmap", &match_release, INT_PTR(1));
209 release_function_indicator("pci_iounmap");
210
211 return_implies_state("__create_workqueue_key", valid_ptr_min, valid_ptr_max, &request_granted,
212 INT_PTR(-1));
213 return_implies_state("__create_workqueue_key", 0, 0, &request_denied, INT_PTR(-1));
214 add_function_hook("destroy_workqueue", &match_release, INT_PTR(0));
215
216 return_implies_state("request_irq", 0, 0, &request_granted, INT_PTR(0));
217 return_implies_state("request_irq", -MAX_ERRNO, -1, &request_denied, INT_PTR(0));
218 add_function_hook("free_irq", &match_release, INT_PTR(0));
219 release_function_indicator("free_irq");
220
221 return_implies_state("register_netdev", 0, 0, &request_granted, INT_PTR(0));
222 return_implies_state("register_netdev", -MAX_ERRNO, -1, &request_denied, INT_PTR(0));
223 add_function_hook("unregister_netdev", &match_release, INT_PTR(0));
224 release_function_indicator("unregister_netdev");
225
226 return_implies_state("misc_register", 0, 0, &request_granted, INT_PTR(0));
227 return_implies_state("misc_register", -MAX_ERRNO, -1, &request_denied, INT_PTR(0));
228 add_function_hook("misc_deregister", &match_release, INT_PTR(0));
229 release_function_indicator("misc_deregister");
230
231
232 add_hook(&match_return, RETURN_HOOK);
233 }
|
177 static void release_function_indicator(const char *name)
178 {
179 if (!option_info)
180 return;
181 add_function_hook(name, &print_unwind_functions, INT_PTR(0));
182 }
183
184 void check_unwind(int id)
185 {
186 if (option_project != PROJ_KERNEL || !option_spammy)
187 return;
188 my_id = id;
189
190 register_unwind_functions();
191
192 return_implies_state("request_resource", 0, 0, &request_granted, INT_PTR(1));
193 return_implies_state("request_resource", -EBUSY, -EBUSY, &request_denied, INT_PTR(1));
194 add_function_hook("release_resource", &match_release, INT_PTR(0));
195 release_function_indicator("release_resource");
196
197 return_implies_state_sval("__request_region", valid_ptr_min_sval, valid_ptr_max_sval, &request_granted, INT_PTR(1));
198 return_implies_state("__request_region", 0, 0, &request_denied, INT_PTR(1));
199 add_function_hook("__release_region", &match_release, INT_PTR(1));
200 release_function_indicator("__release_region");
201
202 return_implies_state_sval("ioremap", valid_ptr_min_sval, valid_ptr_max_sval, &request_granted, INT_PTR(-1));
203 return_implies_state("ioremap", 0, 0, &request_denied, INT_PTR(-1));
204 add_function_hook("iounmap", &match_release, INT_PTR(0));
205
206 return_implies_state_sval("pci_iomap", valid_ptr_min_sval, valid_ptr_max_sval, &request_granted, INT_PTR(-1));
207 return_implies_state("pci_iomap", 0, 0, &request_denied, INT_PTR(-1));
208 add_function_hook("pci_iounmap", &match_release, INT_PTR(1));
209 release_function_indicator("pci_iounmap");
210
211 return_implies_state_sval("__create_workqueue_key", valid_ptr_min_sval, valid_ptr_max_sval, &request_granted,
212 INT_PTR(-1));
213 return_implies_state("__create_workqueue_key", 0, 0, &request_denied, INT_PTR(-1));
214 add_function_hook("destroy_workqueue", &match_release, INT_PTR(0));
215
216 return_implies_state("request_irq", 0, 0, &request_granted, INT_PTR(0));
217 return_implies_state("request_irq", -MAX_ERRNO, -1, &request_denied, INT_PTR(0));
218 add_function_hook("free_irq", &match_release, INT_PTR(0));
219 release_function_indicator("free_irq");
220
221 return_implies_state("register_netdev", 0, 0, &request_granted, INT_PTR(0));
222 return_implies_state("register_netdev", -MAX_ERRNO, -1, &request_denied, INT_PTR(0));
223 add_function_hook("unregister_netdev", &match_release, INT_PTR(0));
224 release_function_indicator("unregister_netdev");
225
226 return_implies_state("misc_register", 0, 0, &request_granted, INT_PTR(0));
227 return_implies_state("misc_register", -MAX_ERRNO, -1, &request_denied, INT_PTR(0));
228 add_function_hook("misc_deregister", &match_release, INT_PTR(0));
229 release_function_indicator("misc_deregister");
230
231 add_hook(&match_return, RETURN_HOOK);
232 }
|