提交 c490c557 编写于 作者: C Christophe Ricard 提交者: Samuel Ortiz

NFC: st21nfca: Fix some skb memory leaks

Fix some memory leaks after some nfc_hci_get_param calls.
Signed-off-by: NChristophe Ricard <christophe-h.ricard@st.com>
Signed-off-by: NSamuel Ortiz <sameo@linux.intel.com>
上级 2b702832
...@@ -261,8 +261,9 @@ static int st21nfca_hci_ready(struct nfc_hci_dev *hdev) ...@@ -261,8 +261,9 @@ static int st21nfca_hci_ready(struct nfc_hci_dev *hdev)
if (r < 0) if (r < 0)
return r; return r;
if (skb->data[0] == 0) { param = skb->data[0];
kfree_skb(skb); kfree_skb(skb);
if (param == 0) {
param = 1; param = 1;
r = nfc_hci_set_param(hdev, ST21NFCA_DEVICE_MGNT_GATE, r = nfc_hci_set_param(hdev, ST21NFCA_DEVICE_MGNT_GATE,
...@@ -404,9 +405,12 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev, ...@@ -404,9 +405,12 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE, r = nfc_hci_set_param(hdev, ST21NFCA_RF_CARD_F_GATE,
ST21NFCA_RF_CARD_F_DATARATE, ST21NFCA_RF_CARD_F_DATARATE,
param, 1); param, 1);
if (r < 0) if (r < 0) {
kfree_skb(datarate_skb);
return r; return r;
}
} }
kfree_skb(datarate_skb);
/* /*
* Configure sens_res * Configure sens_res
...@@ -660,15 +664,15 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev, ...@@ -660,15 +664,15 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
struct nfc_target *target) struct nfc_target *target)
{ {
int r; int r;
struct sk_buff *nfcid2_skb = NULL, *nfcid1_skb; struct sk_buff *nfcid_skb = NULL;
if (gate == ST21NFCA_RF_READER_F_GATE) { if (gate == ST21NFCA_RF_READER_F_GATE) {
r = nfc_hci_get_param(hdev, 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) if (r < 0)
goto exit; goto exit;
if (nfcid2_skb->len > NFC_SENSF_RES_MAXSIZE) { if (nfcid_skb->len > NFC_SENSF_RES_MAXSIZE) {
r = -EPROTO; r = -EPROTO;
goto exit; goto exit;
} }
...@@ -680,11 +684,11 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev, ...@@ -680,11 +684,11 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
* - After the reception of SEL_RES with NFCIP-1 compliant bit * - After the reception of SEL_RES with NFCIP-1 compliant bit
* set for type A frame NFCID1 will be updated * set for type A frame NFCID1 will be updated
*/ */
if (nfcid2_skb->len > 0) { if (nfcid_skb->len > 0) {
/* P2P in type F */ /* P2P in type F */
memcpy(target->sensf_res, nfcid2_skb->data, memcpy(target->sensf_res, nfcid_skb->data,
nfcid2_skb->len); nfcid_skb->len);
target->sensf_res_len = nfcid2_skb->len; target->sensf_res_len = nfcid_skb->len;
/* NFC Forum Digital Protocol Table 44 */ /* NFC Forum Digital Protocol Table 44 */
if (target->sensf_res[0] == 0x01 && if (target->sensf_res[0] == 0x01 &&
target->sensf_res[1] == 0xfe) target->sensf_res[1] == 0xfe)
...@@ -694,27 +698,28 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev, ...@@ -694,27 +698,28 @@ static int st21nfca_hci_complete_target_discovered(struct nfc_hci_dev *hdev,
target->supported_protocols = target->supported_protocols =
NFC_PROTO_FELICA_MASK; NFC_PROTO_FELICA_MASK;
} else { } else {
kfree_skb(nfcid_skb);
/* P2P in type A */ /* P2P in type A */
r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE, r = nfc_hci_get_param(hdev, ST21NFCA_RF_READER_F_GATE,
ST21NFCA_RF_READER_F_NFCID1, ST21NFCA_RF_READER_F_NFCID1,
&nfcid1_skb); &nfcid_skb);
if (r < 0) if (r < 0)
goto exit; goto exit;
if (nfcid1_skb->len > NFC_NFCID1_MAXSIZE) { if (nfcid_skb->len > NFC_NFCID1_MAXSIZE) {
r = -EPROTO; r = -EPROTO;
goto exit; goto exit;
} }
memcpy(target->sensf_res, nfcid1_skb->data, memcpy(target->sensf_res, nfcid_skb->data,
nfcid1_skb->len); nfcid_skb->len);
target->sensf_res_len = nfcid1_skb->len; target->sensf_res_len = nfcid_skb->len;
target->supported_protocols = NFC_PROTO_NFC_DEP_MASK; target->supported_protocols = NFC_PROTO_NFC_DEP_MASK;
} }
target->hci_reader_gate = ST21NFCA_RF_READER_F_GATE; target->hci_reader_gate = ST21NFCA_RF_READER_F_GATE;
} }
r = 1; r = 1;
exit: exit:
kfree_skb(nfcid2_skb); kfree_skb(nfcid_skb);
return r; return r;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册