Skip to content

Commit 317b691

Browse files
committed
check and free dde global handles
1 parent ffc24bf commit 317b691

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

krnl386/global.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,23 @@ HGLOBAL16 WINAPI GlobalReAlloc16(
556556
return !(pNewArena->handle ^ handle & ~1) ? handle : pNewArena->handle;
557557
}
558558

559+
static void check_gptr(HANDLE src)
560+
{
561+
HANDLE dst;
562+
BOOL valid = FALSE;
563+
if ((DWORD)dst & 4)
564+
{
565+
if (GlobalFlags(dst) != GMEM_INVALID_HANDLE)
566+
valid = TRUE;
567+
}
568+
else
569+
{
570+
if (HeapValidate(GetProcessHeap(), 0, dst))
571+
valid = TRUE;
572+
}
573+
if (valid)
574+
GlobalFree(src);
575+
}
559576

560577
/***********************************************************************
561578
* GlobalFree (KERNEL.17)
@@ -588,7 +605,7 @@ HGLOBAL16 WINAPI GlobalFree16(
588605
HGLOBAL ddehndl = GLOBAL_GetLink(handle);
589606
if (!GLOBAL_FreeBlock( handle )) return handle; /* failed */
590607
HeapFree( get_win16_heap(), 0, ptr );
591-
if (ddehndl) GlobalFree(ddehndl);
608+
if (ddehndl) check_gptr(ddehndl);
592609
return 0;
593610
}
594611

user/message.c

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,7 +1479,32 @@ static void convert_dde_msg_32_to_16(int msg, HANDLE16 handle)
14791479
*(HANDLE16 *)data = convert_cb_data_32_16(format, *(HANDLE *)data, FALSE);
14801480
GlobalUnlock16(handle);
14811481
}
1482-
1482+
1483+
static void check_gptr(HANDLE16 src)
1484+
{
1485+
HANDLE dst;
1486+
if (!src) return;
1487+
if (dst = GLOBAL_GetLink(src))
1488+
{
1489+
BOOL valid = FALSE;
1490+
if ((DWORD)dst & 4)
1491+
{
1492+
if (GlobalFlags(dst) != GMEM_INVALID_HANDLE)
1493+
valid = TRUE;
1494+
}
1495+
else
1496+
{
1497+
if (HeapValidate(GetProcessHeap(), 0, dst))
1498+
valid = TRUE;
1499+
}
1500+
if (!valid)
1501+
{
1502+
GLOBAL_SetLink(src, 0);
1503+
GlobalFree16(src);
1504+
}
1505+
}
1506+
}
1507+
14831508
/**********************************************************************
14841509
* WINPROC_CallProc16To32A
14851510
*/
@@ -1864,13 +1889,15 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1
18641889
convert_dde_msg_16_to_32(msg, lo32);
18651890
lParam = PackDDElParam( msg, lo32, topic16_32(HIWORD(lParam)) );
18661891
ret = callback( hwnd32, msg, (WPARAM)WIN_Handle32(wParam), lParam, result, arg );
1892+
check_gptr(lo16);
18671893
}
1868-
break; /* FIXME don't know how to free allocated memory (handle) !! */
1894+
break;
18691895
case WM_DDE_ACK:
18701896
{
18711897
UINT_PTR lo = LOWORD(lParam);
18721898
UINT_PTR hi = HIWORD(lParam);
18731899
int flag = 0;
1900+
UINT_PTR hi16 = 0;
18741901
char buf[256];
18751902

18761903
if (hi >= 0xc000 && GlobalGetAtomNameA(hi, buf, 256) > 0) flag |= 1;
@@ -1892,17 +1919,23 @@ LRESULT WINPROC_CallProc16To32A( winproc_callback_t callback, HWND16 hwnd, UINT1
18921919
WARN("DDE_ACK: %lx both atom and handle... choosing handle\n", hi);
18931920
/* fall through */
18941921
case 2:
1922+
hi16 = hi;
18951923
hi = convert_handle_16_to_32(hi, GMEM_DDESHARE);
18961924
break;
18971925
}
18981926
lParam = PackDDElParam( WM_DDE_ACK, lo, hi );
18991927
ret = callback( hwnd32, msg, (WPARAM)WIN_Handle32(wParam), lParam, result, arg );
1928+
if (flag >= 2) check_gptr(hi16);
19001929
}
1901-
break; /* FIXME don't know how to free allocated memory (handle) !! */
1930+
break;
19021931
case WM_DDE_EXECUTE:
1903-
lParam = convert_handle_16_to_32( HIWORD(lParam), GMEM_DDESHARE );
1904-
ret = callback( hwnd32, msg, (WPARAM)HWND_32(wParam), lParam, result, arg );
1905-
break; /* FIXME don't know how to free allocated memory (handle) !! */
1932+
{
1933+
UINT_PTR hi16 = HIWORD(lParam);
1934+
lParam = convert_handle_16_to_32( hi16, GMEM_DDESHARE );
1935+
ret = callback( hwnd32, msg, (WPARAM)HWND_32(wParam), lParam, result, arg );
1936+
check_gptr(hi16);
1937+
}
1938+
break;
19061939
case WM_PAINTCLIPBOARD:
19071940
case WM_SIZECLIPBOARD:
19081941
FIXME_(msg)( "message %04x needs translation\n", msg );

0 commit comments

Comments
 (0)