Starting program: /usr/bin/xfdesktop *** glibc detected *** free(): invalid next size (fast): 0x0000000000776480 *** Program received signal SIGABRT, Aborted. 0x00002aaaacdcc0fd in raise () from /lib/libc.so.6 (gdb) bt #0 0x00002aaaacdcc0fd in raise () from /lib/libc.so.6 #1 0x00002aaaacdcd82e in abort () from /lib/libc.so.6 #2 0x00002aaaace00be1 in __fsetlocking () from /lib/libc.so.6 #3 0x00002aaaace067ee in malloc_trim () from /lib/libc.so.6 #4 0x00002aaaace06b36 in free () from /lib/libc.so.6 #5 0x000000000040c2a8 in desktop_setup_grids (desktop=0x56d6a0, nws=1) at xfce-desktop.c:1320 #6 0x000000000040c572 in desktop_grid_do_resize (desktop=0x56d6a0) at xfce-desktop.c:860 #7 0x000000000040d6af in desktop_rootwin_watch_workarea ( gxevent=0x7fffffdb89f0, event=Variable "event" is not available. ) at xfce-desktop.c:2228 #8 0x00002aaaab3b2a25 in gdk_events_pending () from /usr/lib/libgdk-x11-2.0.so.0 #9 0x00002aaaab3b3557 in gdk_x11_register_standard_event_type () from /usr/lib/libgdk-x11-2.0.so.0 #10 0x00002aaaab3b4dc8 in _gdk_events_queue () from /usr/lib/libgdk-x11-2.0.so.0 #11 0x00002aaaab3b4f1e in _gdk_events_queue () from /usr/lib/libgdk-x11-2.0.so.0 #12 0x00002aaaacc344bd in g_main_context_dispatch () from /usr/lib/libglib-2.0.so.0 #13 0x00002aaaacc3765f in g_main_context_check () from /usr/lib/libglib-2.0.so.0 ---Type <return> to continue, or q <return> to quit--- #14 0x00002aaaacc3790a in g_main_loop_run () from /usr/lib/libglib-2.0.so.0 #15 0x00002aaaab068360 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0 #16 0x00000000004081d7 in main (argc=1, argv=0x7fffffdb8d48) at main.c:304 Reproducible: Always Steps to Reproduce: 1. Run xfce-setting-show workspaces 2. Change the number of workspaces 3. xfdesktop crashes
I'm getting a slightly different stacktrace, but that might be due to optimisation on your copy. Looks like another race condition. xfdesktop notices _NET_WORKAREA changing before it receives the workspace-created signal from NetkScreen, so it assumes it's getting X values out of _NET_WORKAREA when it really gets X+1, and overflows a buffer. What do you think is the best way to do this? Should I count the items in _NET_WORKAREA, and if there are more items than I expect, assume a workspace is being created, and then ignore the workspace-created signal later? I guess what I'm asking is, is there any other reason why the WM would set the number of values in _NET_WORKAREA to something other than n_workspaces * 4?
(In reply to comment #1) > What do you think is the best way to do this? Should I count the items in > _NET_WORKAREA, and if there are more items than I expect, assume a workspace is > being created, and then ignore the workspace-created signal later? I guess what > I'm asking is, is there any other reason why the WM would set the number of > values in _NET_WORKAREA to something other than n_workspaces * 4? Nope, the workarea array defines the workarea for each workspace.
Ok, should be fixed now.