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