From 69674a1e9dc2eb00b8ffebeec253a55ea695ccfd Mon Sep 17 00:00:00 2001 From: Joachim Henze Date: Thu, 9 Feb 2023 16:34:12 +0100 Subject: [PATCH] [0.4.13][GDI32][BUTTERFLIES] Fix a BSOD caused by memory leak CORE-18498 The symptom was unhidden by (regression from users perspective): 0.4.12-dev-389-g 5f2bebf7a5b1a1602b553c43118d745e51c5609c by porting back: 0.4.15-dev-5608-g afb953ae4dd1ca89c66ddd602f22146803b0709d [BUTTERFLIES] Do not release the DC passed to OpenGL. CORE-18498 0.4.15-dev-5607-g 8b19b6ec5abcaf3603e147252fa87fce998ec79e [GDI32] Fix memory leak in case of public DC. CORE-18498 For now I will not port it back further than releases/0.4.12 although the code in both modules might be suboptimal even in earlier release-branches. But we see no symptoms in those yet. --- .../screensavers/butterflies/butterflies.c | 6 ++++-- win32ss/gdi/gdi32/objects/bitmap.c | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/rosapps/applications/screensavers/butterflies/butterflies.c b/modules/rosapps/applications/screensavers/butterflies/butterflies.c index 60f7ed4d171..6d33fd35e66 100644 --- a/modules/rosapps/applications/screensavers/butterflies/butterflies.c +++ b/modules/rosapps/applications/screensavers/butterflies/butterflies.c @@ -12,6 +12,7 @@ HINSTANCE hInstance; // Holds The Instance Of The Application GLuint texture[3]; //stores texture objects and display list +HDC hdcOpenGL; LPCTSTR registryPath = _T("Software\\Microsoft\\ScreenSavers\\Butterflies"); BOOL dRotate; @@ -136,7 +137,7 @@ HGLRC InitOGLWindow(HWND hWnd) hRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hRC); - ReleaseDC(hWnd, hDC); + hdcOpenGL = hDC; return hRC; } @@ -231,7 +232,7 @@ void Display() } INT_PTR CALLBACK AboutProc(HWND hdlg, UINT msg, WPARAM wpm, LPARAM lpm){ - + switch(msg){ case WM_CTLCOLORSTATIC: if(((HWND)lpm == GetDlgItem(hdlg, WEBPAGE1)) || ((HWND)lpm == GetDlgItem(hdlg, WEBPAGE2))) @@ -287,6 +288,7 @@ LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, case WM_DESTROY: wglMakeCurrent(NULL, NULL); wglDeleteContext(hRC); + ReleaseDC(hWnd, hdcOpenGL); break; } diff --git a/win32ss/gdi/gdi32/objects/bitmap.c b/win32ss/gdi/gdi32/objects/bitmap.c index a3f4c482c6f..cc70e85911e 100644 --- a/win32ss/gdi/gdi32/objects/bitmap.c +++ b/win32ss/gdi/gdi32/objects/bitmap.c @@ -755,7 +755,8 @@ SetDIBitsToDevice( if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr)) { SetLastError(ERROR_INVALID_PARAMETER); - return 0; + LinesCopied = 0; + goto Exit; } /* if ( !pDc_Attr || // DC is Public @@ -858,8 +859,7 @@ StretchDIBits( if ( GdiConvertAndCheckDC(hdc) == NULL ) return 0; - pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize, - FALSE); + pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize, FALSE); if (!pConvertedInfo) { return 0; @@ -896,7 +896,8 @@ StretchDIBits( if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr)) { SetLastError(ERROR_INVALID_PARAMETER); - return 0; + LinesCopied = 0; + goto Exit; } /* if ( !pDc_Attr || @@ -910,6 +911,7 @@ StretchDIBits( ConvertedInfoSize, cjBmpScanSize, NULL); } +Exit: if (pvSafeBits) RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits); if (lpBitsInfo != pConvertedInfo)