Comment 18 for bug 985202

Revision history for this message
jth (jth) wrote :

Hi
Same for me, current precise with recommended updates.

Application: Kwin (kwin), signal: Segmentation fault
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[Current thread is 1 (Thread 0x7f8b112f7780 (LWP 25307))]
<cut>
Thread 1 (Thread 0x7f8b112f7780 (LWP 25307)):
[KCrash Handler]
#6 __GI___libc_free (mem=0x1) at malloc.c:2968
#7 0x00007f8b0e557819 in XFree (data=<optimized out>) at ../../src/XlibInt.c:1701
#8 0x00007f8b0e0ff2ee in XRRUpdateConfiguration (event=0x7fff66a34f10) at ../../src/Xrandr.c:446
#9 0x00007f8b10e49a30 in KWin::Workspace::workspaceEvent (this=0x1e83d50, e=0x7fff66a34f10) at ../../kwin/events.cpp:460
#10 0x00007f8b10e3b288 in KWin::Application::x11EventFilter (this=0x7fff66a35220, e=0x7fff66a34f10) at ../../kwin/main.cpp:359
#11 0x00007f8b0b728b85 in qt_x11EventFilter (ev=0x7fff66a34f10) at kernel/qapplication_x11.cpp:441
#12 qt_x11EventFilter (ev=0x7fff66a34f10) at kernel/qapplication_x11.cpp:429
#13 0x00007f8b0b737f98 in QApplication::x11ProcessEvent (this=0x7fff66a35220, event=0x7fff66a34f10) at kernel/qapplication_x11.cpp:3444
#14 0x00007f8b0b762b3a in QEventDispatcherX11::processEvents (this=0x1d7cad0, flags=...) at kernel/qeventdispatcher_x11.cpp:132
#15 0x00007f8b0c335c82 in QEventLoop::processEvents (this=<optimized out>, flags=...) at kernel/qeventloop.cpp:149
#16 0x00007f8b0c335ed7 in QEventLoop::exec (this=0x7fff66a35160, flags=...) at kernel/qeventloop.cpp:204
#17 0x00007f8b0c33af67 in QCoreApplication::exec () at kernel/qcoreapplication.cpp:1148
#18 0x00007f8b10e3da06 in kdemain (argc=<optimized out>, argv=<optimized out>) at ../../kwin/main.cpp:541
#19 0x00007f8b10a4176d in __libc_start_main (main=0x400630 <main(int, char**)>, argc=1, ubp_av=0x7fff66a35948, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff66a35938) at libc-start.c:226
#20 0x0000000000400661 in _start ()

Will try some random code changes and see what it does and if I find something.

int XFree (void *data)
{ Xfree (data);
 return 1;
}

int XRRUpdateConfiguration(XEvent *event)
{ XRRScreenChangeNotifyEvent *scevent;
    XConfigureEvent *rcevent;
    Display *dpy = event->xany.display;
    XExtDisplayInfo *info;
    XRandRInfo *xrri;
    int snum;

    /* first, see if it is a vanilla configure notify event */
    if (event->type == ConfigureNotify) {
        rcevent = (XConfigureEvent *) event;
        snum = XRRRootToScreen(dpy, rcevent->window);
        if (snum != -1) {
            dpy->screens[snum].width = rcevent->width;
            dpy->screens[snum].height = rcevent->height;
            return 1;
    } }

    info = XRRFindDisplay(dpy);
    RRCheckExtension (dpy, info, 0);

    switch (event->type - info->codes->first_event) {
    case RRScreenChangeNotify:
        scevent = (XRRScreenChangeNotifyEvent *) event;
        snum = XRRRootToScreen(dpy,
                               ((XRRScreenChangeNotifyEvent *) event)->root);
        if (scevent->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
                dpy->screens[snum].width = scevent->height;
                dpy->screens[snum].height = scevent->width;
                dpy->screens[snum].mwidth = scevent->mheight;
                dpy->screens[snum].mheight = scevent->mwidth;
        } else {
                dpy->screens[snum].width = scevent->width;
                dpy->screens[snum].height = scevent->height;
                dpy->screens[snum].mwidth = scevent->mwidth;
                dpy->screens[snum].mheight = scevent->mheight;
        }
        XRenderSetSubpixelOrder (dpy, snum, scevent->subpixel_order);
        break;
    default:
        return 0;
    }
    xrri = (XRandRInfo *) info->data;
    /*
     * so the next time someone wants some data, it will be fetched;
     * it might be better to force the round trip immediately, but
     * I dislike pounding the server simultaneously when not necessary
     */
    if (xrri->config[snum] != NULL) {
        XFree (xrri->config[snum]);
        xrri->config[snum] = NULL;
    }
    return 1;
}

Just trying to understand what it is trying to free. Maybe from the XRRFindDisplay(..

_X_HIDDEN XExtDisplayInfo *
XRRFindDisplay (Display *dpy)
{
    XExtDisplayInfo *dpyinfo;
    XRandRInfo *xrri;
    int i, numscreens;

    dpyinfo = XextFindDisplay (&XRRExtensionInfo, dpy);
    if (!dpyinfo) {
        dpyinfo = XextAddDisplay (&XRRExtensionInfo, dpy,
                                  XRRExtensionName,
                                  &rr_extension_hooks,
                                  RRNumberEvents, NULL);
        numscreens = ScreenCount(dpy);
        xrri = Xmalloc (sizeof(XRandRInfo) +
                                 sizeof(char *) * numscreens);
        xrri->config = (XRRScreenConfiguration **)(xrri + 1);
        for(i = 0; i < numscreens; i++)
          xrri->config[i] = NULL;
        xrri->major_version = -1;
        dpyinfo->data = (char *) xrri;
    }
    return dpyinfo;
}