Alexandre Julliard : winex11: Added an error handler to catch bad atoms in clipboard selections.
Alexandre Julliard
julliard at winehq.org
Wed Apr 9 14:31:34 CDT 2008
Module: wine
Branch: master
Commit: 704ac5a51ef54de92851638d0860c697fa39d7ab
URL: http://source.winehq.org/git/wine.git/?a=commit;h=704ac5a51ef54de92851638d0860c697fa39d7ab
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Apr 9 20:09:40 2008 +0200
winex11: Added an error handler to catch bad atoms in clipboard selections.
---
dlls/winex11.drv/clipboard.c | 21 +++++++++++++--------
1 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index cdf54c1..af5ff9d 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -1728,6 +1728,11 @@ static BOOL X11DRV_CLIPBOARD_QueryTargets(Display *display, Window w, Atom selec
}
+static int is_atom_error( Display *display, XErrorEvent *event, void *arg )
+{
+ return (event->error_code == BadAtom);
+}
+
/**************************************************************************
* X11DRV_CLIPBOARD_InsertSelectionProperties
*
@@ -1759,7 +1764,7 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p
lpFormat = X11DRV_CLIPBOARD_LookupProperty(lpFormat, properties[i]);
}
}
- else
+ else if (properties[i])
{
/* add it to the list of atoms that we don't know about yet */
if (!atoms) atoms = HeapAlloc( GetProcessHeap(), 0,
@@ -1774,13 +1779,13 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p
char **names = HeapAlloc( GetProcessHeap(), 0, nb_atoms * sizeof(*names) );
if (names)
{
- wine_tsx11_lock();
- /* FIXME: we're at the mercy of the app sending the event here.
- * Currently if they send a bogus atom, we will crash.
- * We should handle BadAtom errors gracefully in this call.
- */
- XGetAtomNames( display, atoms, nb_atoms, names );
- wine_tsx11_unlock();
+ X11DRV_expect_error( display, is_atom_error, NULL );
+ if (!XGetAtomNames( display, atoms, nb_atoms, names )) nb_atoms = 0;
+ if (X11DRV_check_error())
+ {
+ WARN( "got some bad atoms, ignoring\n" );
+ nb_atoms = 0;
+ }
for (i = 0; i < nb_atoms; i++)
{
WINE_CLIPFORMAT *lpFormat;
More information about the wine-cvs
mailing list