From 7ed0f25b64932f079dfdfd68e9ad1675fa606114 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Fri, 9 Oct 2020 14:28:32 +0200 Subject: [PATCH] [GDI32] Prevent double initialization in GdiProcessSetup Found with Application Verifier :) --- win32ss/gdi/gdi32/main/dllmain.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/win32ss/gdi/gdi32/main/dllmain.c b/win32ss/gdi/gdi32/main/dllmain.c index b59dfbe4210..322fc156435 100644 --- a/win32ss/gdi/gdi32/main/dllmain.c +++ b/win32ss/gdi/gdi32/main/dllmain.c @@ -4,6 +4,7 @@ #include +static BOOL gbInitialized = FALSE; extern HGDIOBJ stock_objects[]; BOOL SetStockObjects = FALSE; PDEVCAPS GdiDevCaps = NULL; @@ -40,18 +41,22 @@ VOID WINAPI GdiProcessSetup(VOID) { - hProcessHeap = GetProcessHeap(); + if (!gbInitialized) + { + gbInitialized = TRUE; + hProcessHeap = GetProcessHeap(); - /* map the gdi handle table to user space */ - GdiHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable; - GdiSharedHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable; - GdiDevCaps = &GdiSharedHandleTable->DevCaps; - CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess; - GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList; - GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer; - RtlInitializeCriticalSection(&semLocal); - InitializeCriticalSection(&gcsClientObjLinks); - GdiInitializeLanguagePack(0); + /* map the gdi handle table to user space */ + GdiHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable; + GdiSharedHandleTable = NtCurrentTeb()->ProcessEnvironmentBlock->GdiSharedHandleTable; + GdiDevCaps = &GdiSharedHandleTable->DevCaps; + CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess; + GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList; + GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer; + RtlInitializeCriticalSection(&semLocal); + InitializeCriticalSection(&gcsClientObjLinks); + GdiInitializeLanguagePack(0); + } } VOID