From: "Gustavo A. R. Silva" <gust...@embeddedor.com>

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 code was detected with the help of Coccinelle.

Signed-off-by: Gustavo A. R. Silva <gust...@embeddedor.com>
Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
---
 .../net/wireless/intel/iwlwifi/iwl-nvm-parse.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c 
b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
index 503860a2b36d..ca6a243d704b 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
@@ -946,15 +946,13 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct 
iwl_cfg *cfg,
        const __le16 *ch_section;
 
        if (cfg->nvm_type != IWL_NVM_EXT)
-               data = kzalloc(sizeof(*data) +
-                              sizeof(struct ieee80211_channel) *
-                              IWL_NVM_NUM_CHANNELS,
-                              GFP_KERNEL);
+               data = kzalloc(struct_size(data, channels,
+                                          IWL_NVM_NUM_CHANNELS),
+                                          GFP_KERNEL);
        else
-               data = kzalloc(sizeof(*data) +
-                              sizeof(struct ieee80211_channel) *
-                              IWL_NVM_NUM_CHANNELS_EXT,
-                              GFP_KERNEL);
+               data = kzalloc(struct_size(data, channels,
+                                          IWL_NVM_NUM_CHANNELS_EXT),
+                                          GFP_KERNEL);
        if (!data)
                return NULL;
 
@@ -1441,9 +1439,7 @@ struct iwl_nvm_data *iwl_get_nvm(struct iwl_trans *trans,
        if (empty_otp)
                IWL_INFO(trans, "OTP is empty\n");
 
-       nvm = kzalloc(sizeof(*nvm) +
-                     sizeof(struct ieee80211_channel) * IWL_NUM_CHANNELS,
-                     GFP_KERNEL);
+       nvm = kzalloc(struct_size(nvm, channels, IWL_NUM_CHANNELS), GFP_KERNEL);
        if (!nvm) {
                ret = -ENOMEM;
                goto out;
-- 
2.20.1

Reply via email to