From ae63905eb97e036756352bfc1576e5f71ffc3873 Mon Sep 17 00:00:00 2001 From: Frank Lichtenheld Date: Thu, 14 May 2026 11:15:06 +0200 Subject: [PATCH] openvpnserv: Fix memory leak when loading DLLs Identified by cppcheck. Change-Id: Iad3f0c36ac3795fa6a13f2d63bd00ad9c2c30d48 Signed-off-by: Frank Lichtenheld Acked-by: Heiko Hund Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1670 Message-Id: <20260514091512.17662-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg36913.html Signed-off-by: Gert Doering --- src/openvpnserv/interactive.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/openvpnserv/interactive.c b/src/openvpnserv/interactive.c index 164f1bfb..7726bc92 100644 --- a/src/openvpnserv/interactive.c +++ b/src/openvpnserv/interactive.c @@ -1071,6 +1071,7 @@ ApplyGpolSettings32(void) publish_fn_t RtlPublishWnfStateData; const DWORD WNF_GPOL_SYSTEM_CHANGES_HI = 0x0D891E2A; const DWORD WNF_GPOL_SYSTEM_CHANGES_LO = 0xA3BC0875; + BOOL ret = FALSE; HMODULE ntdll = LoadLibraryA("ntdll.dll"); if (ntdll == NULL) @@ -1081,16 +1082,19 @@ ApplyGpolSettings32(void) RtlPublishWnfStateData = (publish_fn_t)GetProcAddress(ntdll, "RtlPublishWnfStateData"); if (RtlPublishWnfStateData == NULL) { - return FALSE; + goto cleanup; } if (RtlPublishWnfStateData(WNF_GPOL_SYSTEM_CHANGES_LO, WNF_GPOL_SYSTEM_CHANGES_HI, 0, 0, 0, 0) != ERROR_SUCCESS) { - return FALSE; + goto cleanup; } - return TRUE; + ret = TRUE; +cleanup: + FreeLibrary(ntdll); + return ret; } /** @@ -1106,6 +1110,7 @@ ApplyGpolSettings64(void) unsigned int Length, INT64 ExplicitScope); publish_fn_t RtlPublishWnfStateData; const INT64 WNF_GPOL_SYSTEM_CHANGES = 0x0D891E2AA3BC0875; + BOOL ret = FALSE; HMODULE ntdll = LoadLibraryA("ntdll.dll"); if (ntdll == NULL) @@ -1116,15 +1121,18 @@ ApplyGpolSettings64(void) RtlPublishWnfStateData = (publish_fn_t)GetProcAddress(ntdll, "RtlPublishWnfStateData"); if (RtlPublishWnfStateData == NULL) { - return FALSE; + goto cleanup; } if (RtlPublishWnfStateData(WNF_GPOL_SYSTEM_CHANGES, 0, 0, 0, 0) != ERROR_SUCCESS) { - return FALSE; + goto cleanup; } - return TRUE; + ret = TRUE; +cleanup: + FreeLibrary(ntdll); + return ret; } /**