← Back to team overview

ubuntu-x-swat team mailing list archive

[Bug 599547] [NEW] Xorg freezes with mwm

 

Public bug reported:

Binary package hint: xorg

Problem occurred with Ubuntu 10.4

Package xserver-xorg-core  2:1.7.6-2ubuntu7.2

mwm has a stuck grab when handling Alt-button key-press causing the mwm
to freeze.

I reported the problem to xorg-devel@xxxxxxxxxxxxxxxxxxxxx. It was confirmed as a problem and a patch was generated. Can this patch be applied to this package?  Please refer to the mailing list for details. The patch is
attached below.

===============================================================================

Date: Fri, 25 Jun 2010 09:48:10 +1000
From: Peter Hutterer <peter.hutterer@xxxxxxxxx>
To: "X.Org Devel List" <xorg-devel@xxxxxxxxxxxxxxxxxxxxx>
Cc: "Peter A. Buhr" <pabuhr@xxxxxxxxxxxxxxxxxxxxxx>,
        Keith Packard <keithp@xxxxxxxxxx>,
        Daniel Stone <daniel@xxxxxxxxxxxxxxx>
Subject: [PATCH] Revert "dix: use the event mask of the grab for
 TryClientEvents."
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Behaviour of earlier X servers was to deliver the ButtonPress event
unconditionally, regardless of the actual event mask being set. Thus, a
GrabButton event will always deliver the button press event, a GrabKey
always the key press event, etc. Same goes for XI and XI2.

Reproducible with a simple client requesting a button grab in the form of:
    XGrabButton(dpy, AnyButton, AnyModifier, win, True, ButtonReleaseMask,
                GrabModeAsync, GrabModeAsync, None, None);

On servers before MPX/XI2, the client will receive a button press and
release event. On current servers, the client receives only the release.
Clients that expect the press event to be delivered unconditionally may
leave the user with a stuck grab.

XTS test results for XGrabButton are identical with and without this
patch.

This reverts commit 48585bd1e3e98db0f3df1ecc68022510216e00cc.

Conflicts:

        dix/events.c

Signed-off-by: Peter Hutterer <peter.hutterer@xxxxxxxxx>
---
 dix/events.c |   52 ++--------------------------------------------------
 1 files changed, 2 insertions(+), 50 deletions(-)

diff --git a/dix/events.c b/dix/events.c
index ae9847c..e1c3d0a 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3420,7 +3420,6 @@ CheckPassiveGrabsOnWindow(
     {
 	DeviceIntPtr	gdev;
 	XkbSrvInfoPtr	xkbi = NULL;
-	Mask		mask = 0;
 
 	gdev= grab->modifierDevice;
         if (grab->grabtype == GRABTYPE_CORE)
@@ -3535,9 +3534,6 @@ CheckPassiveGrabsOnWindow(
                 }
                 xE = &core;
                 count = 1;
-                mask = grab->eventMask;
-                if (grab->ownerEvents)
-                    mask |= pWin->eventMask;
             } else if (match & XI2_MATCH)
             {
                 rc = EventToXI2((InternalEvent*)event, &xE);
@@ -3549,34 +3545,6 @@ CheckPassiveGrabsOnWindow(
                     continue;
                 }
                 count = 1;
-
-                /* FIXME: EventToXI2 returns NULL for enter events, so
-                 * dereferencing the event is bad. Internal event types are
-                 * aligned with core events, so the else clause is valid.
-                 * long-term we should use internal events for enter/focus
-                 * as well */
-                if (xE)
-                    mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8];
-                else if (event->type == XI_Enter || event->type == XI_FocusIn)
-                    mask = grab->xi2mask[device->id][event->type/8];
-
-                if (grab->ownerEvents && wOtherInputMasks(grab->window))
-                {
-                    InputClientsPtr icp =
-                        wOtherInputMasks(grab->window)->inputClients;
-
-                    while(icp)
-                    {
-                        if (rClient(icp) == rClient(grab))
-                        {
-                            int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type;
-                            mask |= icp->xi2mask[device->id][evtype/8];
-                            break;
-                        }
-
-                        icp = icp->next;
-                    }
-                }
             } else
             {
                 rc = EventToXI((InternalEvent*)event, &xE, &count);
@@ -3587,23 +3555,6 @@ CheckPassiveGrabsOnWindow(
                                 "(%d, %d).\n", device->name, event->type, rc);
                     continue;
                 }
-                mask = grab->eventMask;
-                if (grab->ownerEvents && wOtherInputMasks(grab->window))
-                {
-                    InputClientsPtr icp =
-                        wOtherInputMasks(grab->window)->inputClients;
-
-                    while(icp)
-                    {
-                        if (rClient(icp) == rClient(grab))
-                        {
-                            mask |= icp->mask[device->id];
-                            break;
-                        }
-
-                        icp = icp->next;
-                    }
-                }
             }
 
 	    (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE);
@@ -3612,7 +3563,8 @@ CheckPassiveGrabsOnWindow(
             {
                 FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
 
-                TryClientEvents(rClient(grab), device, xE, count, mask,
+                TryClientEvents(rClient(grab), device, xE, count,
+                                       GetEventFilter(device, xE),
                                        GetEventFilter(device, xE), grab);
             }
 
-- 
1.7.1

ProblemType: Bug
DistroRelease: Ubuntu 10.04
Package: xorg 1:7.5+5ubuntu1
ProcVersionSignature: Ubuntu 2.6.32-22.36-generic 2.6.32.11+drm33.2
Uname: Linux 2.6.32-22-generic i686
Architecture: i386
Date: Mon Jun 28 16:15:15 2010
DkmsStatus: Error: [Errno 2] No such file or directory
InstallationMedia: Ubuntu 10.04 "Lucid Lynx" - Beta i386 (20100317.1)
MachineType: LENOVO 200793U
PccardctlIdent:
 Socket 0:
   no product info available
PccardctlStatus:
 Socket 0:
   no card
ProcCmdLine: BOOT_IMAGE=/boot/vmlinuz-2.6.32-22-generic root=UUID=f5b377fb-90cf-4601-b325-07416c8ae837 ro quiet splash nomodeset
ProcEnviron:
 LANGUAGE=en_CA:en
 PATH=(custom, user)
 LANG=en_CA.UTF-8
 SHELL=/bin/tcsh
SourcePackage: xorg
Symptom: display
Title: Xorg freeze
dmi.bios.date: 11/24/2006
dmi.bios.vendor: LENOVO
dmi.bios.version: 79ETC7WW (2.07 )
dmi.board.name: 200793U
dmi.board.vendor: LENOVO
dmi.board.version: Not Available
dmi.chassis.asset.tag: No Asset Information
dmi.chassis.type: 10
dmi.chassis.vendor: LENOVO
dmi.chassis.version: Not Available
dmi.modalias: dmi:bvnLENOVO:bvr79ETC7WW(2.07):bd11/24/2006:svnLENOVO:pn200793U:pvrThinkPadT60p:rvnLENOVO:rn200793U:rvrNotAvailable:cvnLENOVO:ct10:cvrNotAvailable:
dmi.product.name: 200793U
dmi.product.version: ThinkPad T60p
dmi.sys.vendor: LENOVO
glxinfo: Error: [Errno 2] No such file or directory
system:
 distro:             Ubuntu
 codename:           lucid
 architecture:       i686
 kernel:             2.6.32-22-generic
xkbcomp:
 Error: command ['xkbcomp', ':0', '-w0', '-'] failed with exit code 1: No protocol specified
 Error:            Cannot open display ":0"
                   Exiting

** Affects: xorg (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: apport-bug freeze i386 lucid

-- 
Xorg freezes with mwm
https://bugs.launchpad.net/bugs/599547
You received this bug notification because you are a member of Ubuntu-X,
which is subscribed to xorg in ubuntu.



Follow ups

References