aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <ben.hutchings@codethink.co.uk>2015-01-22 07:40:13 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-26 19:13:15 -0500
commiteebfb643c0799ecb98ba77d4a0dd0e56f6a17553 (patch)
treedb5ef7b64f42667f721a7932d4641d55f5bad9b7
parent02a54164c52ed6eca3089a0d402170fbf34d6cf5 (diff)
sh_eth: Fix padding of short frames on TX
If an skb to be transmitted is shorter than the minimum Ethernet frame length, we currently set the DMA descriptor length to the minimum but do not add zero-padding. This could result in leaking sensitive data. We also pass different lengths to dma_map_single() and dma_unmap_single(). Use skb_padto() to pad properly, before calling dma_map_single(). Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/renesas/sh_eth.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 6576243222af..4ae22fc05918 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -2117,6 +2117,9 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
2117 } 2117 }
2118 spin_unlock_irqrestore(&mdp->lock, flags); 2118 spin_unlock_irqrestore(&mdp->lock, flags);
2119 2119
2120 if (skb_padto(skb, ETH_ZLEN))
2121 return NETDEV_TX_OK;
2122
2120 entry = mdp->cur_tx % mdp->num_tx_ring; 2123 entry = mdp->cur_tx % mdp->num_tx_ring;
2121 mdp->tx_skbuff[entry] = skb; 2124 mdp->tx_skbuff[entry] = skb;
2122 txdesc = &mdp->tx_ring[entry]; 2125 txdesc = &mdp->tx_ring[entry];
@@ -2126,10 +2129,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
2126 skb->len + 2); 2129 skb->len + 2);
2127 txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len, 2130 txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len,
2128 DMA_TO_DEVICE); 2131 DMA_TO_DEVICE);
2129 if (skb->len < ETH_ZLEN) 2132 txdesc->buffer_length = skb->len;
2130 txdesc->buffer_length = ETH_ZLEN;
2131 else
2132 txdesc->buffer_length = skb->len;
2133 2133
2134 if (entry >= mdp->num_tx_ring - 1) 2134 if (entry >= mdp->num_tx_ring - 1)
2135 txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE); 2135 txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE);