winex11: Added an error handler to catch bad atoms in clipboard selections.
authorAlexandre Julliard <julliard@winehq.org>
Wed, 9 Apr 2008 18:09:40 +0000 (20:09 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 9 Apr 2008 18:09:40 +0000 (20:09 +0200)
dlls/winex11.drv/clipboard.c

index cdf54c1b41ebaeb70300b4ce9f2655359617ee4a..af5ff9d05346baf76d70b9f1db4a416fc3d74b9c 100644 (file)
@@ -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;