mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 16:53:54 +08:00
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>
This commit is contained in:
parent
02a54164c5
commit
eebfb643c0
@ -2117,6 +2117,9 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
}
|
||||
spin_unlock_irqrestore(&mdp->lock, flags);
|
||||
|
||||
if (skb_padto(skb, ETH_ZLEN))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
entry = mdp->cur_tx % mdp->num_tx_ring;
|
||||
mdp->tx_skbuff[entry] = skb;
|
||||
txdesc = &mdp->tx_ring[entry];
|
||||
@ -2126,10 +2129,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
skb->len + 2);
|
||||
txdesc->addr = dma_map_single(&ndev->dev, skb->data, skb->len,
|
||||
DMA_TO_DEVICE);
|
||||
if (skb->len < ETH_ZLEN)
|
||||
txdesc->buffer_length = ETH_ZLEN;
|
||||
else
|
||||
txdesc->buffer_length = skb->len;
|
||||
txdesc->buffer_length = skb->len;
|
||||
|
||||
if (entry >= mdp->num_tx_ring - 1)
|
||||
txdesc->status |= cpu_to_edmac(mdp, TD_TACT | TD_TDLE);
|
||||
|
Loading…
Reference in New Issue
Block a user