diff options
author | Ryo Kataoka <ryo.kataoka.wt@renesas.com> | 2019-03-22 20:50:16 +0900 |
---|---|---|
committer | Ryo Kataoka <ryo.kataoka.wt@renesas.com> | 2019-03-22 20:50:16 +0900 |
commit | 0043eec1e00e4ed5265fca2fb36385c9b184bf75 (patch) | |
tree | 239ff659708f32cd43f77b6079b3209838ec49a2 | |
parent | a9580312f193558476af176c19090b2ad33a90a5 (diff) | |
parent | 2e4d341d1cc11c055a336feebed9d1ddaa9097b6 (diff) | |
download | renesas-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.c | 10 |
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 839e473f7fc49..77518c8449205 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); } |