summaryrefslogtreecommitdiffstats
path: root/drivers/staging/sxg
diff options
context:
space:
mode:
authorMithlesh Thukral2009-02-18 14:22:18 +0100
committerGreg Kroah-Hartman2009-04-03 23:53:12 +0200
commitb9d1081a833806e2f8ee7d8b827202e1bd5949b2 (patch)
tree39830ec9ca92e03b721442d196cfdd450e3f3127 /drivers/staging/sxg
parentStaging: sxg: Add Checksum Offload support for Sahara SXG driver (diff)
downloadkernel-qcow2-linux-b9d1081a833806e2f8ee7d8b827202e1bd5949b2.tar.gz
kernel-qcow2-linux-b9d1081a833806e2f8ee7d8b827202e1bd5949b2.tar.xz
kernel-qcow2-linux-b9d1081a833806e2f8ee7d8b827202e1bd5949b2.zip
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 <saharaproj@linsyssoft.com> Signed-off-by: Mithlesh Thukral <mithlesh@linsyssoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/sxg')
-rw-r--r--drivers/staging/sxg/sxg.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/staging/sxg/sxg.c b/drivers/staging/sxg/sxg.c
index da286f5765cb..9ce3af53c891 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);
}