From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/winex11.drv/xdnd.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index 461463d7212..6f114c5a13f 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -304,12 +304,16 @@ static HRESULT data_object_create( UINT entries_size, const struct format_entry return S_OK; } -static struct data_object *get_data_object(void) +static struct data_object *get_data_object( BOOL clear ) { IDataObject *iface; EnterCriticalSection( &xdnd_cs ); - if ((iface = xdnd_data_object)) IDataObject_AddRef( iface ); + if ((iface = xdnd_data_object)) + { + if (clear) xdnd_data_object = NULL; + else IDataObject_AddRef( iface ); + } LeaveCriticalSection( &xdnd_cs ); if (!iface) return NULL; @@ -432,7 +436,7 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) HWND targetWindow; HRESULT hr; - if (!(object = get_data_object())) return STATUS_INVALID_PARAMETER; + if (!(object = get_data_object( FALSE ))) return STATUS_INVALID_PARAMETER; XDNDxy = params->point; targetWindow = window_from_point_dnd( UlongToHandle( params->hwnd ), XDNDxy ); @@ -522,7 +526,7 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) struct data_object *object; BOOL drop_file = TRUE; - if (!(object = get_data_object())) return STATUS_INVALID_PARAMETER; + if (!(object = get_data_object( TRUE ))) return STATUS_INVALID_PARAMETER; /* Notify OLE of Drop */ if (XDNDAccepted) @@ -611,7 +615,7 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size ) { IDropTarget *dropTarget; - IDataObject *object; + struct data_object *object; TRACE("DND Operation canceled\n"); @@ -628,12 +632,7 @@ NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size ) } } - EnterCriticalSection( &xdnd_cs ); - object = xdnd_data_object; - xdnd_data_object = NULL; - LeaveCriticalSection( &xdnd_cs ); - - if (object) IDataObject_Release( object ); + if ((object = get_data_object( TRUE ))) IDataObject_Release( &object->IDataObject_iface ); X11DRV_XDND_FreeDragDropOp(); return STATUS_SUCCESS; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/6682