diff options
author | Mark A. Greer <mgreer@animalcreek.com> | 2014-09-23 19:38:02 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2014-11-28 06:37:47 -0500 |
commit | b15829ba5e82b919513f8ac70e97b4e474fae641 (patch) | |
tree | c7a64e6e7db2d9de2af319b8b3a91f3310037da8 | |
parent | 18ca43823f3ce111c6efb8cc90d9f35246527727 (diff) |
NFC: digital: Fix potential skb leaks in NFC-DEP code
When digital_in_send_cmd() or digital_tg_send_cmd()
fail, they do not free the skb that was passed to
them so the routine that allocated the skb should
free it. Currently, there are several routines in
the NFC-DEP code that don't do this so make them.
Reviewed-by: Thierry Escande <thierry.escande@linux.intel.com>
Tested-by: Thierry Escande <thierry.escande@linux.intel.com>
Signed-off-by: Mark A. Greer <mgreer@animalcreek.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
-rw-r--r-- | net/nfc/digital_dep.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/net/nfc/digital_dep.c b/net/nfc/digital_dep.c index b60aa35c074f..70fcce03e8a9 100644 --- a/net/nfc/digital_dep.c +++ b/net/nfc/digital_dep.c | |||
@@ -198,6 +198,7 @@ static int digital_in_send_psl_req(struct nfc_digital_dev *ddev, | |||
198 | { | 198 | { |
199 | struct sk_buff *skb; | 199 | struct sk_buff *skb; |
200 | struct digital_psl_req *psl_req; | 200 | struct digital_psl_req *psl_req; |
201 | int rc; | ||
201 | 202 | ||
202 | skb = digital_skb_alloc(ddev, sizeof(*psl_req)); | 203 | skb = digital_skb_alloc(ddev, sizeof(*psl_req)); |
203 | if (!skb) | 204 | if (!skb) |
@@ -217,8 +218,12 @@ static int digital_in_send_psl_req(struct nfc_digital_dev *ddev, | |||
217 | 218 | ||
218 | ddev->skb_add_crc(skb); | 219 | ddev->skb_add_crc(skb); |
219 | 220 | ||
220 | return digital_in_send_cmd(ddev, skb, 500, digital_in_recv_psl_res, | 221 | rc = digital_in_send_cmd(ddev, skb, 500, digital_in_recv_psl_res, |
221 | target); | 222 | target); |
223 | if (rc) | ||
224 | kfree_skb(skb); | ||
225 | |||
226 | return rc; | ||
222 | } | 227 | } |
223 | 228 | ||
224 | static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg, | 229 | static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg, |
@@ -286,6 +291,7 @@ int digital_in_send_atr_req(struct nfc_digital_dev *ddev, | |||
286 | struct sk_buff *skb; | 291 | struct sk_buff *skb; |
287 | struct digital_atr_req *atr_req; | 292 | struct digital_atr_req *atr_req; |
288 | uint size; | 293 | uint size; |
294 | int rc; | ||
289 | 295 | ||
290 | size = DIGITAL_ATR_REQ_MIN_SIZE + gb_len; | 296 | size = DIGITAL_ATR_REQ_MIN_SIZE + gb_len; |
291 | 297 | ||
@@ -325,8 +331,12 @@ int digital_in_send_atr_req(struct nfc_digital_dev *ddev, | |||
325 | 331 | ||
326 | ddev->skb_add_crc(skb); | 332 | ddev->skb_add_crc(skb); |
327 | 333 | ||
328 | return digital_in_send_cmd(ddev, skb, 500, digital_in_recv_atr_res, | 334 | rc = digital_in_send_cmd(ddev, skb, 500, digital_in_recv_atr_res, |
329 | target); | 335 | target); |
336 | if (rc) | ||
337 | kfree_skb(skb); | ||
338 | |||
339 | return rc; | ||
330 | } | 340 | } |
331 | 341 | ||
332 | static int digital_in_send_rtox(struct nfc_digital_dev *ddev, | 342 | static int digital_in_send_rtox(struct nfc_digital_dev *ddev, |
@@ -357,6 +367,8 @@ static int digital_in_send_rtox(struct nfc_digital_dev *ddev, | |||
357 | 367 | ||
358 | rc = digital_in_send_cmd(ddev, skb, 1500, digital_in_recv_dep_res, | 368 | rc = digital_in_send_cmd(ddev, skb, 1500, digital_in_recv_dep_res, |
359 | data_exch); | 369 | data_exch); |
370 | if (rc) | ||
371 | kfree_skb(skb); | ||
360 | 372 | ||
361 | return rc; | 373 | return rc; |
362 | } | 374 | } |
@@ -634,7 +646,6 @@ static int digital_tg_send_psl_res(struct nfc_digital_dev *ddev, u8 did, | |||
634 | 646 | ||
635 | rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete, | 647 | rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete, |
636 | (void *)(unsigned long)rf_tech); | 648 | (void *)(unsigned long)rf_tech); |
637 | |||
638 | if (rc) | 649 | if (rc) |
639 | kfree_skb(skb); | 650 | kfree_skb(skb); |
640 | 651 | ||
@@ -758,10 +769,8 @@ static int digital_tg_send_atr_res(struct nfc_digital_dev *ddev, | |||
758 | 769 | ||
759 | rc = digital_tg_send_cmd(ddev, skb, 999, | 770 | rc = digital_tg_send_cmd(ddev, skb, 999, |
760 | digital_tg_send_atr_res_complete, NULL); | 771 | digital_tg_send_atr_res_complete, NULL); |
761 | if (rc) { | 772 | if (rc) |
762 | kfree_skb(skb); | 773 | kfree_skb(skb); |
763 | return rc; | ||
764 | } | ||
765 | 774 | ||
766 | return rc; | 775 | return rc; |
767 | } | 776 | } |