Print this page
smatch: check libld_* allocation functions

*** 24,33 **** --- 24,38 ---- const char *func; int param; int param2; }; + static struct allocator illumos_user_allocator_table[] = { + {"libld_malloc", 0}, + {"libld_realloc", 1}, + }; + static struct allocator generic_allocator_table[] = { {"malloc", 0}, {"memdup", 1}, {"realloc", 1}, };
*** 47,63 **** {"devm_kmalloc", 1}, {"devm_kzalloc", 1}, {"krealloc", 1}, }; ! static struct allocator calloc_table[] = { {"calloc", 0, 1}, {"kcalloc", 0, 1}, {"kmalloc_array", 0, 1}, {"devm_kcalloc", 1, 2}, }; static int bytes_per_element(struct expression *expr) { struct symbol *type; type = get_type(expr); --- 52,79 ---- {"devm_kmalloc", 1}, {"devm_kzalloc", 1}, {"krealloc", 1}, }; ! static struct allocator illumos_user_calloc_table[] = { ! {"libld_calloc", 0, 1}, {"calloc", 0, 1}, {"kcalloc", 0, 1}, {"kmalloc_array", 0, 1}, {"devm_kcalloc", 1, 2}, }; + static struct allocator generic_calloc_table[] = { + {"calloc", 0, 1}, + }; + + static struct allocator kernel_calloc_table[] = { + {"kcalloc", 0, 1}, + {"kmalloc_array", 0, 1}, + {"devm_kcalloc", 1, 2}, + }; + static int bytes_per_element(struct expression *expr) { struct symbol *type; type = get_type(expr);
*** 322,331 **** --- 338,373 ---- size_arg = generic_allocator_table[i].param; goto found; } } + for (i = 0; i < ARRAY_SIZE(generic_calloc_table); i++) { + if (strcmp(right->fn->symbol->ident->name, + generic_calloc_table[i].func) == 0) { + size_arg = generic_calloc_table[i].param; + size_arg2 = generic_calloc_table[i].param2; + goto found; + } + } + + if (option_project == PROJ_ILLUMOS_USER) { + if (strcmp(right->fn->symbol->ident->name, + illumos_user_allocator_table[i].func) == 0) { + size_arg = illumos_user_allocator_table[i].param; + goto found; + } + + for (i = 0; i < ARRAY_SIZE(illumos_user_calloc_table); i++) { + if (strcmp(right->fn->symbol->ident->name, + illumos_user_calloc_table[i].func) == 0) { + size_arg = illumos_user_calloc_table[i].param; + size_arg2 = illumos_user_calloc_table[i].param2; + goto found; + } + } + } + if (option_project != PROJ_KERNEL) return; for (i = 0; i < ARRAY_SIZE(kernel_allocator_table); i++) { if (strcmp(right->fn->symbol->ident->name,
*** 333,347 **** size_arg = kernel_allocator_table[i].param; goto found; } } ! for (i = 0; i < ARRAY_SIZE(calloc_table); i++) { if (strcmp(right->fn->symbol->ident->name, ! calloc_table[i].func) == 0) { ! size_arg = calloc_table[i].param; ! size_arg2 = calloc_table[i].param2; goto found; } } return; --- 375,389 ---- size_arg = kernel_allocator_table[i].param; goto found; } } ! for (i = 0; i < ARRAY_SIZE(kernel_calloc_table); i++) { if (strcmp(right->fn->symbol->ident->name, ! kernel_calloc_table[i].func) == 0) { ! size_arg = kernel_calloc_table[i].param; ! size_arg2 = kernel_calloc_table[i].param2; goto found; } } return;
*** 465,475 **** add_hook(&match_assign_constraint, ASSIGNMENT_HOOK); add_allocation_function("malloc", &match_alloc, 0); add_allocation_function("memdup", &match_alloc, 1); add_allocation_function("realloc", &match_alloc, 1); ! add_allocation_function("realloc", &match_calloc, 0); if (option_project == PROJ_KERNEL) { add_allocation_function("kmalloc", &match_alloc, 0); add_allocation_function("kzalloc", &match_alloc, 0); add_allocation_function("vmalloc", &match_alloc, 0); add_allocation_function("__vmalloc", &match_alloc, 0); --- 507,522 ---- add_hook(&match_assign_constraint, ASSIGNMENT_HOOK); add_allocation_function("malloc", &match_alloc, 0); add_allocation_function("memdup", &match_alloc, 1); add_allocation_function("realloc", &match_alloc, 1); ! add_allocation_function("calloc", &match_calloc, 0); ! if (option_project == PROJ_ILLUMOS_USER) { ! add_allocation_function("libld_malloc", &match_alloc, 0); ! add_allocation_function("libld_realloc", &match_alloc, 1); ! add_allocation_function("libld_calloc", &match_calloc, 0); ! } if (option_project == PROJ_KERNEL) { add_allocation_function("kmalloc", &match_alloc, 0); add_allocation_function("kzalloc", &match_alloc, 0); add_allocation_function("vmalloc", &match_alloc, 0); add_allocation_function("__vmalloc", &match_alloc, 0);