From: Johannes Anderwald Date: Sat, 30 Oct 2010 15:40:54 +0000 (+0000) Subject: [PORTCLS] X-Git-Tag: backups/baikalnet@57446~55 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=951c6f7fa315e2e3fd5c995a43258635874a11bb [PORTCLS] - Do not leak KSSTREAM_HEADER (48 bytes) for each IOCTL_KS_WRITE_STREAM / IOCTL_KS_READ_STREAM request - Audio stack should now leak less memory svn path=/trunk/; revision=49356 --- diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp index a19a6da6e5c..9602d31f88f 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp @@ -293,6 +293,7 @@ CIrpQueue::UpdateMapping( { PKSSTREAM_HEADER StreamHeader; ULONG Size, NumData, Index; + PMDL CurMdl, NextMdl; if (!m_Irp) { @@ -385,13 +386,50 @@ CIrpQueue::UpdateMapping( return; } + // now free allocated mdls + CurMdl = m_Irp->MdlAddress; + for(Index = 0; Index < STREAMHEADER_COUNT(m_Irp); Index++) + { + // sanity check + ASSERT(CurMdl); + + // get next mdl + NextMdl = CurMdl->Next; + + // check if mdl is locked + if (CurMdl->MdlFlags & MDL_PAGES_LOCKED) + { + // unlock pages + MmUnlockPages(CurMdl); + } + + // free mdl + IoFreeMdl(CurMdl); + + // proceed to next mdl + CurMdl = NextMdl; + } + + // all mdls have been freed now + m_Irp->MdlAddress = NULL; + + // free allocated KSSTREAM_HEADER + ExFreePool(m_Irp->AssociatedIrp.SystemBuffer); + + // is this really needed? + m_Irp->AssociatedIrp.SystemBuffer = NULL; + + // store operation status m_Irp->IoStatus.Status = STATUS_SUCCESS; m_Irp->IoStatus.Information = NumData; // complete the request IoCompleteRequest(m_Irp, IO_SOUND_INCREMENT); + // remove irp as it is complete m_Irp = NULL; + + // reset offset m_CurrentOffset = 0; } } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp index ab4322aa943..d1040aa9c60 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_topology.cpp @@ -251,7 +251,7 @@ CPortTopology::Init( // create the subdevice descriptor Status = PcCreateSubdeviceDescriptor(&m_SubDeviceDescriptor, 2, - InterfaceGuids, + InterfaceGuids, 0, NULL, 2,