[Xcb] Segfault in XNextEvent() when using XCB

Peter Hutterer mailinglists at who-t.net
Tue Nov 28 00:49:07 PST 2006


Hey guys,

I found a problem with running some little apps.
I use some very simple apps to check the event stream from the X  
server. All of them started crashing when I started testing MPX  
today. The X Server and XCB are both pulled from git (X server last  
week, XCB today).

There are some weird behaviours:
* Using plain Xlib (in Ubunty Breezy) works, linking against XCB  
makes it crash.
* Using PointerMotionMask as well instead of just DeviceMotion will  
not crash the program,
* If I hook up xmond between the server and the client, I can see the  
input extension events but they never arrive at the client. From what  
I can tell by debugging the X server before they are sent out, their  
values are sane.

Here is a very simple program that will crash.
=======
#include <stdio.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>

int main (int argc, char** argv)
{
     Display* display;
     Window win;
     XDevice* dev;
     XEventClass class_1;
     XSetWindowAttributes attr;
     int screen;
     int win_width, win_height;
     int type_1;

     display = XOpenDisplay(argv[1]);
     screen = DefaultScreen(display);
     assert(display != NULL);

     win_width = 640;
     win_height = 480;


     dev = XOpenDevice(display, atoi(argv[2]));
     assert(dev != NULL);
     DeviceMotionNotify(dev, type_1, class_1);

     attr.background_pixel = WhitePixel(display, screen);
     attr.event_mask = ExposureMask | StructureNotifyMask; //|  
PointerMotionMask;

     win = XCreateWindow(display,
             RootWindow(display, 0),
             0, 0,
             win_width,
             win_height,
             7,
             DefaultDepth(display, 0),
             InputOutput,
             DefaultVisual(display, 0),
             CWBackPixel | CWEventMask,
             &attr);

     XMapWindow(display, win);

     XSelectExtensionEvent(display, win, &class_1, 1);
     XSync(display, False);


     while(1)
     {
         XEvent e;
         XNextEvent(display, &e);
         XDeviceMotionEvent* mev;

         switch(e.type)
         {
             default:
                 if (e.type == type_1)
                 {
                     printf("Motion notify\n");
                     printf(" state %d\n", mev->state);
                     printf(" devstate %d\n", mev->device_state);
                 } else
                 {
                     printf("Unknown event type %d\n", e.type);
                 }
                 break;
         }
     }

     XCloseDisplay(display);
     return 0;
}

=======

(gdb) run roo:1 2
Starting program: /home/whot/code/junk/X/XCB_segfault/xcbsegfault roo: 
1 2
Unknown event type 19
Unknown event type 12

Program received signal SIGSEGV, Segmentation fault.
0xb7d5985c in memcpy () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0  0xb7d5985c in memcpy () from /lib/tls/i686/cmov/libc.so.6
#1  0xb7e747f2 in XNextEvent (dpy=0xbfc496e4, event=0xbfc496e4) at  
NextEvent.c:52
#2  0x08048895 in main (argc=3, argv=0xbfc49844) at main.c:55
(gdb) up 1
#1  0xb7e747f2 in XNextEvent (dpy=0xbfc496e4, event=0xbfc496e4) at  
NextEvent.c:52
52              *event = qelt->event;
(gdb)



Cheers,
   Peter

--
Multi-Pointer X Server
http://wearables.unisa.edu.au/mpx


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freedesktop.org/archives/xcb/attachments/20061128/bffcaa29/attachment.html


More information about the Xcb mailing list