iwlwifi: don't leak memory on allocation failure
authorJohannes Berg <johannes.berg@intel.com>
Tue, 28 Feb 2017 15:44:16 +0000 (16:44 +0100)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 25 Apr 2017 19:48:56 +0000 (22:48 +0300)
If we fail to allocate the small chunk of memory for the
pieces of the firmware file, we leak the whole firmware
image instead...

Since the allocation failure is really unlikely, just bail
out at that point instead.

Remove the error message at the label since we now (and
actually have been) use it for various reasons.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-drv.c

index 212fb8d5c0642456643c18a79ba60f3b394adfbb..98a03a4615d64a013752ab905529d1260633b4e8 100644 (file)
@@ -1282,7 +1282,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
 
        pieces = kzalloc(sizeof(*pieces), GFP_KERNEL);
        if (!pieces)
-               return;
+               goto out_free_fw;
 
        if (!ucode_raw)
                goto try_again;
@@ -1512,17 +1512,18 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
        goto free;
 
  out_free_fw:
-       IWL_ERR(drv, "failed to allocate pci memory\n");
        iwl_dealloc_ucode(drv);
        release_firmware(ucode_raw);
  out_unbind:
        complete(&drv->request_firmware_complete);
        device_release_driver(drv->trans->dev);
  free:
-       for (i = 0; i < ARRAY_SIZE(pieces->img); i++)
-               kfree(pieces->img[i].sec);
-       kfree(pieces->dbg_mem_tlv);
-       kfree(pieces);
+       if (pieces) {
+               for (i = 0; i < ARRAY_SIZE(pieces->img); i++)
+                       kfree(pieces->img[i].sec);
+               kfree(pieces->dbg_mem_tlv);
+               kfree(pieces);
+       }
 }
 
 struct iwl_drv *iwl_drv_start(struct iwl_trans *trans)