From 9cac6ddd71be0a7329c9127040404d56e247c6cb Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 31 Mar 2017 09:16:45 +0000 Subject: [PATCH 1/1] [USBEHCI][USBOHCI][USBUHCI] - Avoid leaking CUSBRequest::m_CompletionEvent. Based on a patch by ReactCoder. CORE-12984 #resolve svn path=/trunk/; revision=74246 --- reactos/drivers/usb/usbehci/usb_request.cpp | 20 +++++++++++++++++-- reactos/drivers/usb/usbohci/usb_request.cpp | 21 +++++++++++++++++--- reactos/drivers/usb/usbuhci/usb_request.cpp | 22 +++++++++++++++++---- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/usb/usbehci/usb_request.cpp b/reactos/drivers/usb/usbehci/usb_request.cpp index 1df7faf2e48..39c58f4200b 100644 --- a/reactos/drivers/usb/usbehci/usb_request.cpp +++ b/reactos/drivers/usb/usbehci/usb_request.cpp @@ -56,8 +56,8 @@ public: VOID DumpQueueHead(IN PQUEUE_HEAD QueueHead); // constructor / destructor - CUSBRequest(IUnknown *OuterUnknown){} - virtual ~CUSBRequest(){} + CUSBRequest(IUnknown *OuterUnknown); + virtual ~CUSBRequest(); protected: LONG m_Ref; @@ -137,6 +137,22 @@ protected: }; +//---------------------------------------------------------------------------------------- +CUSBRequest::CUSBRequest(IUnknown *OuterUnknown) : + m_CompletionEvent(NULL) +{ + UNREFERENCED_PARAMETER(OuterUnknown); +} + +//---------------------------------------------------------------------------------------- +CUSBRequest::~CUSBRequest() +{ + if (m_CompletionEvent != NULL) + { + ExFreePoolWithTag(m_CompletionEvent, TAG_USBEHCI); + } +} + //---------------------------------------------------------------------------------------- NTSTATUS STDMETHODCALLTYPE diff --git a/reactos/drivers/usb/usbohci/usb_request.cpp b/reactos/drivers/usb/usbohci/usb_request.cpp index 355edf06f00..153130620eb 100644 --- a/reactos/drivers/usb/usbohci/usb_request.cpp +++ b/reactos/drivers/usb/usbohci/usb_request.cpp @@ -59,10 +59,9 @@ public: NTSTATUS BuildTransferDescriptorChain(IN PVOID TransferBuffer, IN ULONG TransferBufferLength, IN UCHAR PidCode, OUT POHCI_GENERAL_TD * OutFirstDescriptor, OUT POHCI_GENERAL_TD * OutLastDescriptor, OUT PULONG OutTransferBufferOffset); VOID InitDescriptor(IN POHCI_GENERAL_TD CurrentDescriptor, IN PVOID TransferBuffer, IN ULONG TransferBufferLength, IN UCHAR PidCode); - // constructor / destructor - CUSBRequest(IUnknown *OuterUnknown){} - virtual ~CUSBRequest(){} + CUSBRequest(IUnknown *OuterUnknown); + virtual ~CUSBRequest(); protected: LONG m_Ref; @@ -145,6 +144,22 @@ protected: PVOID m_Base; }; +//---------------------------------------------------------------------------------------- +CUSBRequest::CUSBRequest(IUnknown *OuterUnknown) : + m_CompletionEvent(NULL) +{ + UNREFERENCED_PARAMETER(OuterUnknown); +} + +//---------------------------------------------------------------------------------------- +CUSBRequest::~CUSBRequest() +{ + if (m_CompletionEvent != NULL) + { + ExFreePoolWithTag(m_CompletionEvent, TAG_USBOHCI); + } +} + //---------------------------------------------------------------------------------------- NTSTATUS STDMETHODCALLTYPE diff --git a/reactos/drivers/usb/usbuhci/usb_request.cpp b/reactos/drivers/usb/usbuhci/usb_request.cpp index db5ebcb0126..0b667b6e293 100644 --- a/reactos/drivers/usb/usbuhci/usb_request.cpp +++ b/reactos/drivers/usb/usbuhci/usb_request.cpp @@ -54,11 +54,9 @@ public: VOID FreeDescriptor(IN PUHCI_TRANSFER_DESCRIPTOR Descriptor); NTSTATUS BuildTransferDescriptorChain(IN PVOID TransferBuffer, IN ULONG TransferBufferLength, IN UCHAR PidCode, IN UCHAR InitialDataToggle, OUT PUHCI_TRANSFER_DESCRIPTOR * OutFirstDescriptor, OUT PUHCI_TRANSFER_DESCRIPTOR * OutLastDescriptor, OUT PULONG OutTransferBufferOffset, OUT PUCHAR OutDataToggle); - - // constructor / destructor - CUSBRequest(IUnknown *OuterUnknown){} - virtual ~CUSBRequest(){} + CUSBRequest(IUnknown *OuterUnknown); + virtual ~CUSBRequest(); protected: LONG m_Ref; @@ -135,6 +133,22 @@ protected: }; +//---------------------------------------------------------------------------------------- +CUSBRequest::CUSBRequest(IUnknown *OuterUnknown) : + m_CompletionEvent(NULL) +{ + UNREFERENCED_PARAMETER(OuterUnknown); +} + +//---------------------------------------------------------------------------------------- +CUSBRequest::~CUSBRequest() +{ + if (m_CompletionEvent != NULL) + { + ExFreePoolWithTag(m_CompletionEvent, TAG_USBUHCI); + } +} + //---------------------------------------------------------------------------------------- NTSTATUS STDMETHODCALLTYPE -- 2.17.1