From 349b76795f4f2cd5369d088305d69e5b96e4238e Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 15 Feb 2022 08:30:46 -0600 Subject: [PATCH] Fix a memory leak in onecore interactivity (#12340) As noted in #6759: > `RtlCreateUnicodeString` creates a copy of the string on the process heap and the `PortName` variable has local-scope. The string doesn't get freed with `RtlFreeUnicodeString` before the function returns creating a memory leak. > `CIS_ALPC_PORT_NAME` is a constant string and the `PortName` variable should instead be initialized using the `RTL_CONSTANT_STRING` macro: > > ```c++ > static UNICODE_STRING PortName = RTL_CONSTANT_STRING(CIS_ALPC_PORT_NAME); > ``` I actually built this in the OS repo to make sure it'll still build, because this code doesn't even build outside Windows. * [x] Closes #6759 * I work here. --- src/interactivity/onecore/ConIoSrvComm.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/interactivity/onecore/ConIoSrvComm.cpp b/src/interactivity/onecore/ConIoSrvComm.cpp index cdeebed38c3..e38b677efac 100644 --- a/src/interactivity/onecore/ConIoSrvComm.cpp +++ b/src/interactivity/onecore/ConIoSrvComm.cpp @@ -71,12 +71,11 @@ ConIoSrvComm::~ConIoSrvComm() [[nodiscard]] NTSTATUS ConIoSrvComm::Connect() { - BOOL Ret = TRUE; NTSTATUS Status = STATUS_SUCCESS; // Port handle and name. HANDLE PortHandle; - UNICODE_STRING PortName; + static UNICODE_STRING PortName = RTL_CONSTANT_STRING(CIS_ALPC_PORT_NAME); // Generic Object Manager attributes for the port object and ALPC-specific // port attributes. @@ -98,13 +97,6 @@ ConIoSrvComm::~ConIoSrvComm() // Structure used to iterate over the handles given to us by the server. ALPC_MESSAGE_HANDLE_INFORMATION HandleInfo; - // Initialize the server port name. - Ret = RtlCreateUnicodeString(&PortName, CIS_ALPC_PORT_NAME); - if (!Ret) - { - return STATUS_NO_MEMORY; - } - // Initialize the attributes of the port object. InitializeObjectAttributes(&ObjectAttributes, NULL,