From: Mithlesh Thukral Date: Wed, 18 Feb 2009 13:22:18 +0000 (+0530) Subject: Staging: sxg: Fix memory leak in case of allocation failure X-Git-Tag: v2.6.30-rc1~202^2~661 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=b9d1081a833806e2f8ee7d8b827202e1bd5949b2;p=~emulex%2Finfiniband.git Staging: sxg: Fix memory leak in case of allocation failure * 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 --- diff --git a/drivers/staging/sxg/sxg.c b/drivers/staging/sxg/sxg.c index da286f5765c..9ce3af53c89 100644 --- a/drivers/staging/sxg/sxg.c +++ b/drivers/staging/sxg/sxg.c @@ -4212,6 +4212,21 @@ static int sxg_fill_descriptor_block(struct adapter_t *adapter, 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); }