From mithlesh@linsyssoft.com Wed Feb 18 15:52:32 2009 From: Mithlesh Thukral Date: Wed, 18 Feb 2009 18:52:18 +0530 (IST) Subject: Staging: sxg: Fix memory leak in case of allocation failure To: Greg Kroah-Hartman Cc: Sahara Project , Christopher Harrer Message-ID: From: Mithlesh Thukral * Fix a memory leak if allocation of skb fails in sxg_fill_descriptor_block. In sxg_fill_descriptor_block(), if allocation of skb failed in loop, we just came out shouting. This rollbacks all the successful operation before skb allocation fails and then returns. Signed-off-by: LinSysSoft Sahara Team Signed-off-by: Mithlesh Thukral Signed-off-by: Greg Kroah-Hartman --- drivers/staging/sxg/sxg.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) --- a/drivers/staging/sxg/sxg.c +++ b/drivers/staging/sxg/sxg.c @@ -4212,6 +4212,21 @@ static int sxg_fill_descriptor_block(str adapter->FreeRcvBufferCount, adapter->AllRcvBlockCount); return (STATUS_SUCCESS); no_memory: + for (; i >= 0 ; i--) { + if (RcvDescriptorBlock->Descriptors[i].VirtualAddress) { + RcvDataBufferHdr = (struct sxg_rcv_data_buffer_hdr *) + RcvDescriptorBlock->Descriptors[i]. + VirtualAddress; + RcvDescriptorBlock->Descriptors[i].PhysicalAddress = + (dma_addr_t)NULL; + RcvDescriptorBlock->Descriptors[i].VirtualAddress=NULL; + } + SXG_FREE_RCV_DATA_BUFFER(adapter, RcvDataBufferHdr); + } + RcvDescriptorBlockHdr->State = SXG_BUFFER_FREE; + SXG_RETURN_CMD(RingZero, RcvRingInfo, RingDescriptorCmd, + RcvDescriptorBlockHdr); + return (-ENOMEM); }