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);