aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyo Kataoka <ryo.kataoka.wt@renesas.com>2019-03-22 20:50:16 +0900
committerRyo Kataoka <ryo.kataoka.wt@renesas.com>2019-03-22 20:50:16 +0900
commit0043eec1e00e4ed5265fca2fb36385c9b184bf75 (patch)
tree239ff659708f32cd43f77b6079b3209838ec49a2
parenta9580312f193558476af176c19090b2ad33a90a5 (diff)
parent2e4d341d1cc11c055a336feebed9d1ddaa9097b6 (diff)
downloadrenesas-bsp-0043eec1e00e4ed5265fca2fb36385c9b184bf75.tar.gz
Merge branch 'rcar-3.9.2/ravb.rc1' into v4.14.75-ltsi/rcar-3.9.3
* rcar-3.9.2/ravb.rc1: ravb: Protect access to ts_skb_list with spinlock. ravb: Fix use-after-free ravb_tstamp_skb
-rw-r--r--drivers/net/ethernet/renesas/ravb_main.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 839e473f7fc497..77518c8449205c 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1,6 +1,6 @@
/* Renesas Ethernet AVB device driver
*
- * Copyright (C) 2014-2017 Renesas Electronics Corporation
+ * Copyright (C) 2014-2019 Renesas Electronics Corporation
* Copyright (C) 2015 Renesas Solutions Corp.
* Copyright (C) 2015-2016 Cogent Embedded, Inc. <source@cogentembedded.com>
*
@@ -516,7 +516,10 @@ static void ravb_get_tx_tstamp(struct net_device *ndev)
kfree(ts_skb);
if (tag == tfa_tag) {
skb_tstamp_tx(skb, &shhwtstamps);
+ dev_consume_skb_any(skb);
break;
+ } else {
+ dev_kfree_skb_any(skb);
}
}
ravb_modify(ndev, TCCR, TCCR_TFR, TCCR_TFR);
@@ -899,11 +902,11 @@ static int ravb_poll(struct napi_struct *napi, int budget)
}
/* Processing TX Descriptor Ring */
if (tis & mask) {
+ spin_lock_irqsave(&priv->lock, flags);
/* Timestamp updated */
if (q == RAVB_NC)
ravb_get_tx_tstamp(ndev);
- spin_lock_irqsave(&priv->lock, flags);
/* Clear TX interrupt */
ravb_write(ndev, ~(mask | TIS_RESERVED_BIT), TIS);
ravb_tx_free(ndev, q, true);
@@ -1541,7 +1544,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)
}
goto unmap;
}
- ts_skb->skb = skb;
+ ts_skb->skb = skb_get(skb);
ts_skb->tag = priv->ts_skb_tag++;
priv->ts_skb_tag &= 0x3ff;
list_add_tail(&ts_skb->list, &priv->ts_skb_list);
@@ -1663,6 +1666,7 @@ static int ravb_close(struct net_device *ndev)
/* Clear the timestamp list */
list_for_each_entry_safe(ts_skb, ts_skb2, &priv->ts_skb_list, list) {
list_del(&ts_skb->list);
+ kfree_skb(ts_skb->skb);
kfree(ts_skb);
}