From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/event.c | 9 ++++++--- dlls/winex11.drv/unixlib.h | 11 ++++++++++- dlls/winex11.drv/xdnd.c | 11 ++++++----- 3 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 7e40106122b..c0fe82b97eb 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1637,6 +1637,7 @@ static void handle_dnd_protocol( HWND hwnd, XClientMessageEvent *event ) */ static void handle_xdnd_enter_event( HWND hWnd, XClientMessageEvent *event ) { + struct dnd_enter_event_params *params; struct format_entry *data; unsigned long count = 0; Atom *xdndtypes; @@ -1692,11 +1693,13 @@ static void handle_xdnd_enter_event( HWND hWnd, XClientMessageEvent *event )
data = import_xdnd_selection( event->display, event->window, x11drv_atom(XdndSelection), xdndtypes, count, &size ); - if (data) + if (data && (params = malloc( sizeof(*params) + size ))) { - x11drv_client_func( client_func_dnd_enter_event, data, size ); - free( data ); + memcpy( params->entries, data, size ); + x11drv_client_func( client_func_dnd_enter_event, params, sizeof(*params) + size ); + free( params ); } + free( data );
if (event->data.l[1] & 1) XFree(xdndtypes); diff --git a/dlls/winex11.drv/unixlib.h b/dlls/winex11.drv/unixlib.h index 79c959912b8..30a6a618391 100644 --- a/dlls/winex11.drv/unixlib.h +++ b/dlls/winex11.drv/unixlib.h @@ -65,7 +65,7 @@ enum x11drv_client_funcs
C_ASSERT( client_func_last <= NtUserDriverCallbackLast + 1 );
-/* x11drv_dnd_enter_event and x11drv_dnd_post_drop params */ +/* x11drv_dnd_enter_event params */ struct format_entry { UINT format; @@ -73,6 +73,15 @@ struct format_entry char data[1]; };
+/* x11drv_dnd_enter_event params */ +struct dnd_enter_event_params +{ + int placeholder; + struct format_entry entries[]; +}; + +C_ASSERT(sizeof(struct dnd_enter_event_params) == offsetof(struct dnd_enter_event_params, entries[0])); + /* x11drv_dnd_position_event params */ struct dnd_position_event_params { diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index bd2e6158c8b..2d78e859748 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -360,16 +360,17 @@ NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size ) /************************************************************************** * x11drv_dnd_enter_event */ -NTSTATUS WINAPI x11drv_dnd_enter_event( void *params, ULONG size ) +NTSTATUS WINAPI x11drv_dnd_enter_event( void *args, ULONG size ) { - struct format_entry *formats = params; + UINT formats_size = size - offsetof(struct dnd_enter_event_params, entries); + struct dnd_enter_event_params *params = args; XDNDAccepted = FALSE; X11DRV_XDND_FreeDragDropOp(); /* Clear previously cached data */
- if ((xdnd_formats = HeapAlloc( GetProcessHeap(), 0, size ))) + if ((xdnd_formats = HeapAlloc( GetProcessHeap(), 0, formats_size ))) { - memcpy( xdnd_formats, formats, size ); - xdnd_formats_end = (struct format_entry *)((char *)xdnd_formats + size); + memcpy( xdnd_formats, params->entries, formats_size ); + xdnd_formats_end = (struct format_entry *)((char *)xdnd_formats + formats_size); } return STATUS_SUCCESS; }