aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark A. Greer <mgreer@animalcreek.com>2014-09-23 19:38:02 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2014-11-28 06:37:47 -0500
commitb15829ba5e82b919513f8ac70e97b4e474fae641 (patch)
treec7a64e6e7db2d9de2af319b8b3a91f3310037da8
parent18ca43823f3ce111c6efb8cc90d9f35246527727 (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.c25
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
224static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg, 229static 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
332static int digital_in_send_rtox(struct nfc_digital_dev *ddev, 342static 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}