Fix some memory leaks after some nfc_hci_get_param calls.
Signed-off-by: Christophe Ricard <[email protected]>
---
drivers/nfc/st21nfca/st21nfca.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/drivers/nfc/st21nfca/st21nfca.c b/drivers/nfc/st21nfca/st21nfca.c
index f1aced5..f6bb9ba 100644
--- a/drivers/nfc/st21nfca/st21nfca.c
+++ b/drivers/nfc/st21nfca/st21nfca.c
@@ -299,8 +299,9 @@ static int st21nfca_hci_ready(struct nfc_hci_dev *hdev)
if (r < 0)
return r;
- if (skb->data[0] == 0) {
- kfree_skb(skb);
+ param = skb->data[0];
+ kfree_skb(skb);
+ if (param == 0) {
param = 1;
r = nfc_hci_set_param(hdev, ST21NFCA_DEVICE_MGNT_GATE,
@@ -442,9 +443,12 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev
*hdev,
r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
ST21NFCA_RF_CARD_F_DATARATE,
param, 1);
- if (r < 0)
+ if (r < 0) {
+ kfree_skb(datarate_skb);
return r;
+ }
}
+ kfree_skb(datarate_skb);
/*
* Configure sens_res
@@ -698,15 +702,15 @@ static int st21nfca_hci_complete_target_discovered(struct
nfc_hci_dev *hdev,
struct nfc_target *target)
{
int r;
- struct sk_buff *nfcid2_skb = NULL, *nfcid1_skb;
+ struct sk_buff *nfcid_skb;
if (gate == ST21NFCA_RF_READER_F_GATE) {
r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
- ST21NFCA_RF_READER_F_NFCID2, &nfcid2_skb);
+ ST21NFCA_RF_READER_F_NFCID2, &nfcid_skb);
if (r < 0)
goto exit;
- if (nfcid2_skb->len > NFC_SENSF_RES_MAXSIZE) {
+ if (nfcid_skb->len > NFC_SENSF_RES_MAXSIZE) {
r = -EPROTO;
goto exit;
}
@@ -718,11 +722,11 @@ static int st21nfca_hci_complete_target_discovered(struct
nfc_hci_dev *hdev,
* - After the reception of SEL_RES with NFCIP-1 compliant bit
* set for type A frame NFCID1 will be updated
*/
- if (nfcid2_skb->len > 0) {
+ if (nfcid_skb->len > 0) {
/* P2P in type F */
- memcpy(target->sensf_res, nfcid2_skb->data,
- nfcid2_skb->len);
- target->sensf_res_len = nfcid2_skb->len;
+ memcpy(target->sensf_res, nfcid_skb->data,
+ nfcid_skb->len);
+ target->sensf_res_len = nfcid_skb->len;
/* NFC Forum Digital Protocol Table 44 */
if (target->sensf_res[0] == 0x01 &&
target->sensf_res[1] == 0xfe)
@@ -732,27 +736,28 @@ static int st21nfca_hci_complete_target_discovered(struct
nfc_hci_dev *hdev,
target->supported_protocols =
NFC_PROTO_FELICA_MASK;
} else {
+ kfree_skb(nfcid_skb);
/* P2P in type A */
r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
ST21NFCA_RF_READER_F_NFCID1,
- &nfcid1_skb);
+ &nfcid_skb);
if (r < 0)
goto exit;
- if (nfcid1_skb->len > NFC_NFCID1_MAXSIZE) {
+ if (nfcid_skb->len > NFC_NFCID1_MAXSIZE) {
r = -EPROTO;
goto exit;
}
- memcpy(target->sensf_res, nfcid1_skb->data,
- nfcid1_skb->len);
- target->sensf_res_len = nfcid1_skb->len;
+ memcpy(target->sensf_res, nfcid_skb->data,
+ nfcid_skb->len);
+ target->sensf_res_len = nfcid_skb->len;
target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
}
target->hci_reader_gate = ST21NFCA_RF_READER_F_GATE;
}
r = 1;
exit:
- kfree_skb(nfcid2_skb);
+ kfree_skb(nfcid_skb);
return r;
}
--
2.1.0
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html