Module: wine Branch: master Commit: 704ac5a51ef54de92851638d0860c697fa39d7ab URL: http://source.winehq.org/git/wine.git/?a=commit;h=704ac5a51ef54de92851638d08...
Author: Alexandre Julliard julliard@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;