Print this page
smatch: check libld_* allocation functions
@@ -24,10 +24,15 @@
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,17 +52,28 @@
{"devm_kmalloc", 1},
{"devm_kzalloc", 1},
{"krealloc", 1},
};
-static struct allocator calloc_table[] = {
+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,10 +338,36 @@
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,15 +375,15 @@
size_arg = kernel_allocator_table[i].param;
goto found;
}
}
- for (i = 0; i < ARRAY_SIZE(calloc_table); i++) {
+ for (i = 0; i < ARRAY_SIZE(kernel_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;
+ kernel_calloc_table[i].func) == 0) {
+ size_arg = kernel_calloc_table[i].param;
+ size_arg2 = kernel_calloc_table[i].param2;
goto found;
}
}
return;
@@ -465,11 +507,16 @@
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);
+ 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);