OSDN Git Service

iwlwifi: mvm: d3: use struct_size() in kzalloc()
authorGustavo A. R. Silva <gustavo@embeddedor.com>
Fri, 24 Aug 2018 01:15:40 +0000 (20:15 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 20 Dec 2018 07:10:26 +0000 (09:10 +0200)
One of the more common cases of allocation size calculations is finding
the size of a structure that has a zero-sized array at the end, along
with memory for some number of elements for that array. For example:

struct foo {
int stuff;
        void *entry[];
};

instance = kzalloc(sizeof(struct foo) + sizeof(void *) * count, GFP_KERNEL);

Instead of leaving these open-coded and prone to type mistakes, we can
now use the new struct_size() helper:

instance = kzalloc(struct_size(instance, entry, count), GFP_KERNEL);

This issue was detected with the help of Coccinelle.

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index 9b018d0..01b5338 100644 (file)
@@ -1811,8 +1811,7 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,
                n_matches = 0;
        }
 
-       net_detect = kzalloc(sizeof(*net_detect) +
-                            (n_matches * sizeof(net_detect->matches[0])),
+       net_detect = kzalloc(struct_size(net_detect, matches, n_matches),
                             GFP_KERNEL);
        if (!net_detect || !n_matches)
                goto out_report_nd;
@@ -1827,8 +1826,7 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,
                for (j = 0; j < SCAN_OFFLOAD_MATCHING_CHANNELS_LEN; j++)
                        n_channels += hweight8(fw_match->matching_channels[j]);
 
-               match = kzalloc(sizeof(*match) +
-                               (n_channels * sizeof(*match->channels)),
+               match = kzalloc(struct_size(match, channels, n_channels),
                                GFP_KERNEL);
                if (!match)
                        goto out_report_nd;