@@ -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