Print this page
11506 smatch resync

@@ -328,12 +328,10 @@
 static int get_bytes_from_address(struct expression *expr)
 {
         struct symbol *type;
         int ret;
 
-        if (!option_spammy)
-                return 0;
         if (expr->type != EXPR_PREOP || expr->op != '&')
                 return 0;
         type = get_type(expr);
         if (!type)
                 return 0;

@@ -504,10 +502,14 @@
                 if (size <= 0)
                         return NULL;
                 return alloc_int_rl(size - offset.value);
         }
 
+        size = get_stored_size_end_struct_bytes(expr);
+        if (size)
+                return alloc_int_rl(size);
+
         /* buf[4] */
         size = get_real_array_size(expr);
         if (size)
                 return alloc_int_rl(elements_to_bytes(expr, size));
 

@@ -514,14 +516,10 @@
         /* buf = malloc(1024); */
         ret = get_stored_size_bytes(expr);
         if (ret)
                 return ret;
 
-        size = get_stored_size_end_struct_bytes(expr);
-        if (size)
-                return alloc_int_rl(size);
-
         /* char *foo = "BAR" */
         size = get_size_from_initializer(expr);
         if (size)
                 return alloc_int_rl(elements_to_bytes(expr, size));
 

@@ -709,21 +707,19 @@
 }
 
 static void match_calloc(const char *fn, struct expression *expr, void *unused)
 {
         struct expression *right;
-        struct expression *arg;
-        sval_t elements;
-        sval_t size;
+        struct expression *size, *nr, *mult;
+        struct range_list *rl;
 
         right = strip_expr(expr->right);
-        arg = get_argument_from_call_expr(right->args, 0);
-        if (!get_implied_value(arg, &elements))
-                return; // FIXME!!!
-        arg = get_argument_from_call_expr(right->args, 1);
-        if (get_implied_value(arg, &size))
-                store_alloc(expr->left, size_to_rl(elements.value * size.value));
+        nr = get_argument_from_call_expr(right->args, 0);
+        size = get_argument_from_call_expr(right->args, 1);
+        mult = binop_expression(nr, '*', size);
+        if (get_implied_rl(mult, &rl))
+                store_alloc(expr->left, rl);
         else
                 store_alloc(expr->left, size_to_rl(-1));
 }
 
 static void match_page(const char *fn, struct expression *expr, void *_unused)

@@ -871,10 +867,12 @@
 
 void register_buf_size(int id)
 {
         my_size_id = id;
 
+        set_dynamic_states(my_size_id);
+
         add_unmatched_state_hook(my_size_id, &unmatched_size_state);
 
         select_caller_info_hook(set_param_buf_size, BUF_SIZE);
         select_return_states_hook(BUF_SIZE, &db_returns_buf_size);
         add_split_return_callback(print_returned_allocations);

@@ -906,10 +904,13 @@
                 add_allocation_function("krealloc", &match_alloc, 1);
                 add_allocation_function("__alloc_bootmem", &match_alloc, 0);
                 add_allocation_function("alloc_bootmem", &match_alloc, 0);
                 add_allocation_function("kmap", &match_page, 0);
                 add_allocation_function("get_zeroed_page", &match_page, 0);
+                add_allocation_function("alloc_page", &match_page, 0);
+                add_allocation_function("page_address", &match_page, 0);
+                add_allocation_function("lowmem_page_address", &match_page, 0);
                 add_allocation_function("alloc_pages", &match_alloc_pages, 1);
                 add_allocation_function("alloc_pages_current", &match_alloc_pages, 1);
                 add_allocation_function("__get_free_pages", &match_alloc_pages, 1);
         }