mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	solos-pci: fix double-free of TX skb in DMA mode
We weren't clearing card->tx_skb[port] when processing the TX done interrupt. If there wasn't another skb ready to transmit immediately, this led to a double-free because we'd free it *again* next time we did have a packet to send. Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> Cc: stable@kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									fda4d85d61
								
							
						
					
					
						commit
						cae49ede00
					
				
					 1 changed files with 3 additions and 2 deletions
				
			
		| 
						 | 
					@ -945,10 +945,11 @@ static uint32_t fpga_tx(struct solos_card *card)
 | 
				
			||||||
	for (port = 0; tx_pending; tx_pending >>= 1, port++) {
 | 
						for (port = 0; tx_pending; tx_pending >>= 1, port++) {
 | 
				
			||||||
		if (tx_pending & 1) {
 | 
							if (tx_pending & 1) {
 | 
				
			||||||
			struct sk_buff *oldskb = card->tx_skb[port];
 | 
								struct sk_buff *oldskb = card->tx_skb[port];
 | 
				
			||||||
			if (oldskb)
 | 
								if (oldskb) {
 | 
				
			||||||
				pci_unmap_single(card->dev, SKB_CB(oldskb)->dma_addr,
 | 
									pci_unmap_single(card->dev, SKB_CB(oldskb)->dma_addr,
 | 
				
			||||||
						 oldskb->len, PCI_DMA_TODEVICE);
 | 
											 oldskb->len, PCI_DMA_TODEVICE);
 | 
				
			||||||
 | 
									card->tx_skb[port] = NULL;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			spin_lock(&card->tx_queue_lock);
 | 
								spin_lock(&card->tx_queue_lock);
 | 
				
			||||||
			skb = skb_dequeue(&card->tx_queue[port]);
 | 
								skb = skb_dequeue(&card->tx_queue[port]);
 | 
				
			||||||
			if (!skb)
 | 
								if (!skb)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue