Zebediah Figura : win32u: Do not free user memory when deleting dibs created with NtGdiDdDDICreateDCFromMemory().

Alexandre Julliard julliard at winehq.org
Mon Nov 22 16:05:18 CST 2021


Module: wine
Branch: master
Commit: 220b0a7c060e71a7a414cd89542769451274e873
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=220b0a7c060e71a7a414cd89542769451274e873

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Fri Nov 19 18:30:51 2021 -0600

win32u: Do not free user memory when deleting dibs created with NtGdiDdDDICreateDCFromMemory().

This fixes a test crash in ddraw:ddraw1 introduced by
7d2a7b94aad8a776a2ee3031a18bb3b53d5925cd.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/tests/bitmap.c |  6 +++---
 dlls/win32u/dib.c         | 20 +++++++++++++++++++-
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index a244414660b..93793ad7108 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -5969,11 +5969,11 @@ static void test_D3DKMTCreateDCFromMemory( void )
 
     size = VirtualQuery( alloc_data, &memory_info, sizeof(memory_info) );
     ok(size == sizeof(memory_info), "Got unexpected size %u.\n", size);
-    todo_wine ok(memory_info.State == MEM_COMMIT, "Got state %#x.\n", memory_info.State);
-    todo_wine ok(memory_info.Protect == PAGE_READWRITE, "Got protection %#x.\n", memory_info.Protect);
+    ok(memory_info.State == MEM_COMMIT, "Got state %#x.\n", memory_info.State);
+    ok(memory_info.Protect == PAGE_READWRITE, "Got protection %#x.\n", memory_info.Protect);
 
     ret = VirtualFree( alloc_data, 0, MEM_RELEASE );
-    todo_wine ok(ret, "Failed to free memory, error %u.\n", GetLastError());
+    ok(ret, "Failed to free memory, error %u.\n", GetLastError());
 }
 
 START_TEST(bitmap)
diff --git a/dlls/win32u/dib.c b/dlls/win32u/dib.c
index b27b341d470..ee82d1a8ed8 100644
--- a/dlls/win32u/dib.c
+++ b/dlls/win32u/dib.c
@@ -1574,6 +1574,24 @@ error:
 }
 
 
+static BOOL memory_dib_DeleteObject( HGDIOBJ handle )
+{
+    BITMAPOBJ *bmp;
+
+    if (!(bmp = free_gdi_handle( handle ))) return FALSE;
+
+    free( bmp->color_table );
+    free( bmp );
+    return TRUE;
+}
+
+
+static const struct gdi_obj_funcs memory_dib_funcs =
+{
+    .pGetObjectW = DIB_GetObject,
+    .pDeleteObject = memory_dib_DeleteObject,
+};
+
 /***********************************************************************
  *           NtGdiDdDDICreateDCFromMemory    (win32u.@)
  */
@@ -1673,7 +1691,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateDCFromMemory( D3DKMT_CREATEDCFROMMEMORY *desc )
         }
     }
 
-    if (!(bitmap = alloc_gdi_handle( &bmp->obj, NTGDI_OBJ_BITMAP, &dib_funcs ))) goto error;
+    if (!(bitmap = alloc_gdi_handle( &bmp->obj, NTGDI_OBJ_BITMAP, &memory_dib_funcs ))) goto error;
 
     desc->hDc = dc;
     desc->hBitmap = bitmap;




More information about the wine-cvs mailing list