]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
crypto: cavium - add release_firmware to all return case
authorCorentin LABBE <clabbe.montjoie@gmail.com>
Mon, 14 Aug 2017 11:58:54 +0000 (13:58 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 22 Aug 2017 06:54:54 +0000 (14:54 +0800)
Two return case misses to call release_firmware() and so leak some
memory.

This patch create a fw_release label (and so a common error path)
and use it on all return case.

Detected by CoverityScan, CID#1416422 ("Resource Leak")

Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/cavium/cpt/cptpf_main.c

index 4119c40e7c4b02f22d965aa14def47ec7c08f928..34a6d8bf229ef31cf5fbbb200d11c5558745a3c0 100644 (file)
@@ -268,8 +268,10 @@ static int cpt_ucode_load_fw(struct cpt_device *cpt, const u8 *fw, bool is_ae)
        mcode = &cpt->mcode[cpt->next_mc_idx];
        memcpy(mcode->version, (u8 *)fw_entry->data, CPT_UCODE_VERSION_SZ);
        mcode->code_size = ntohl(ucode->code_length) * 2;
-       if (!mcode->code_size)
-               return -EINVAL;
+       if (!mcode->code_size) {
+               ret = -EINVAL;
+               goto fw_release;
+       }
 
        mcode->is_ae = is_ae;
        mcode->core_mask = 0ULL;
@@ -280,7 +282,8 @@ static int cpt_ucode_load_fw(struct cpt_device *cpt, const u8 *fw, bool is_ae)
                                          &mcode->phys_base, GFP_KERNEL);
        if (!mcode->code) {
                dev_err(dev, "Unable to allocate space for microcode");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto fw_release;
        }
 
        memcpy((void *)mcode->code, (void *)(fw_entry->data + sizeof(*ucode)),
@@ -302,12 +305,14 @@ static int cpt_ucode_load_fw(struct cpt_device *cpt, const u8 *fw, bool is_ae)
        ret = do_cpt_init(cpt, mcode);
        if (ret) {
                dev_err(dev, "do_cpt_init failed with ret: %d\n", ret);
-               return ret;
+               goto fw_release;
        }
 
        dev_info(dev, "Microcode Loaded %s\n", mcode->version);
        mcode->is_mc_valid = 1;
        cpt->next_mc_idx++;
+
+fw_release:
        release_firmware(fw_entry);
 
        return ret;