| From 57be6a6964cf1f4899594b40dfc911f674c0034d Mon Sep 17 00:00:00 2001 |
| From: Aditya Pakki <pakki001@umn.edu> |
| Date: Sun, 15 Dec 2019 10:14:51 -0600 |
| Subject: [PATCH] fore200e: Fix incorrect checks of NULL pointer dereference |
| |
| commit bbd20c939c8aa3f27fa30e86691af250bf92973a upstream. |
| |
| In fore200e_send and fore200e_close, the pointers from the arguments |
| are dereferenced in the variable declaration block and then checked |
| for NULL. The patch fixes these issues by avoiding NULL pointer |
| dereferences. |
| |
| Signed-off-by: Aditya Pakki <pakki001@umn.edu> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c |
| index f1a500205313..8fbd36eb8941 100644 |
| --- a/drivers/atm/fore200e.c |
| +++ b/drivers/atm/fore200e.c |
| @@ -1414,12 +1414,14 @@ fore200e_open(struct atm_vcc *vcc) |
| static void |
| fore200e_close(struct atm_vcc* vcc) |
| { |
| - struct fore200e* fore200e = FORE200E_DEV(vcc->dev); |
| struct fore200e_vcc* fore200e_vcc; |
| + struct fore200e* fore200e; |
| struct fore200e_vc_map* vc_map; |
| unsigned long flags; |
| |
| ASSERT(vcc); |
| + fore200e = FORE200E_DEV(vcc->dev); |
| + |
| ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<<FORE200E_VPI_BITS)); |
| ASSERT((vcc->vci >= 0) && (vcc->vci < 1<<FORE200E_VCI_BITS)); |
| |
| @@ -1464,10 +1466,10 @@ fore200e_close(struct atm_vcc* vcc) |
| static int |
| fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb) |
| { |
| - struct fore200e* fore200e = FORE200E_DEV(vcc->dev); |
| - struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc); |
| + struct fore200e* fore200e; |
| + struct fore200e_vcc* fore200e_vcc; |
| struct fore200e_vc_map* vc_map; |
| - struct host_txq* txq = &fore200e->host_txq; |
| + struct host_txq* txq; |
| struct host_txq_entry* entry; |
| struct tpd* tpd; |
| struct tpd_haddr tpd_haddr; |
| @@ -1480,9 +1482,18 @@ fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb) |
| unsigned char* data; |
| unsigned long flags; |
| |
| - ASSERT(vcc); |
| - ASSERT(fore200e); |
| - ASSERT(fore200e_vcc); |
| + if (!vcc) |
| + return -EINVAL; |
| + |
| + fore200e = FORE200E_DEV(vcc->dev); |
| + fore200e_vcc = FORE200E_VCC(vcc); |
| + |
| + if (!fore200e) |
| + return -EINVAL; |
| + |
| + txq = &fore200e->host_txq; |
| + if (!fore200e_vcc) |
| + return -EINVAL; |
| |
| if (!test_bit(ATM_VF_READY, &vcc->flags)) { |
| DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi); |
| -- |
| 2.7.4 |
| |