diff options
author | Christophe JAILLET <christophe.jaillet@wanadoo.fr> | 2017-02-19 10:58:47 +0100 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2017-04-02 00:18:35 +0200 |
commit | 8f79ded95934154d4454b6e422a18a3fbcd7a268 (patch) | |
tree | 3fd1d1aaf10da2b3301deca7f117a2f0426deb42 | |
parent | NFC: nfcmrvl: double free on error path (diff) | |
download | linux-8f79ded95934154d4454b6e422a18a3fbcd7a268.tar.xz linux-8f79ded95934154d4454b6e422a18a3fbcd7a268.zip |
NFC: st21nfca: Fix potential memory leak
If all bits of 'dev_mask' are already set, there is a memory leak because
'info' should be freed before returning.
While fixing it, 'return -ENOMEM' directly if the first kzalloc fails.
This makes the code more readable.
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r-- | drivers/nfc/st21nfca/core.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/nfc/st21nfca/core.c b/drivers/nfc/st21nfca/core.c index dacb9166081b..50be3b788f1c 100644 --- a/drivers/nfc/st21nfca/core.c +++ b/drivers/nfc/st21nfca/core.c @@ -959,10 +959,8 @@ int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, unsigned long quirks = 0; info = kzalloc(sizeof(struct st21nfca_hci_info), GFP_KERNEL); - if (!info) { - r = -ENOMEM; - goto err_alloc_hdev; - } + if (!info) + return -ENOMEM; info->phy_ops = phy_ops; info->phy_id = phy_id; @@ -978,8 +976,10 @@ int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops, * persistent info to discriminate 2 identical chips */ dev_num = find_first_zero_bit(dev_mask, ST21NFCA_NUM_DEVICES); - if (dev_num >= ST21NFCA_NUM_DEVICES) - return -ENODEV; + if (dev_num >= ST21NFCA_NUM_DEVICES) { + r = -ENODEV; + goto err_alloc_hdev; + } set_bit(dev_num, dev_mask); |