Richard Levitte wrote: > monnier> I use a local patch which changes ctwm so as not to use the "maximum > monnier> potential height" of chars, but instead the "average height of > displayed > monnier> chars". I guess I should clean it up and post it here. > > Please do.
[ Wow! I'm seeing email traffic from the CTWM list again! Excellent! Does this mean some list problem was found and fixed? Unfortunately, my own postings are still apparently not being sent back to me... >-/ ] Richard, If you're gathering patches prior to generating a new release, please also include my patches (originally posted back in July) that defend agaisnt the SIGSEGV caused when the global Scr pointer is accidentally allowed to remain NULL. Others here have mentioned mysterious crashes that may also be addressed by my fix. --M ###### REPEATED POSTING FROM JULY: For those who asked, here are excerpts from emails I've sent to Debian regarding the CTWM crashes that I've repaired. ################################################################# A brief sketch of typical usage and failure mode: I am running CTWM with eight workspaces (most are populated) and switching workspaces fairly often. The most active X apps are xterm, Firefox, exmh and mahjongg. I typically have several Firefox windows open, each of which has multiple tabs active, sometimes dozens. Failure seemed most often to happen immediately after I switched workspaces to one containing a Firefox window with a *LOT* of tabs open. I've not seen it even once since this I made this fix. Note that I was usually able to recover my entire X session and continue without harm if I could manage to launch a new instance of CTWM from the console or an SSH session. Until I patched my CTWM I actually had a shell loop right inside my .xsession file that would automatically relaunch CTWM when it crashed, so I was able to live with it for several years before finally getting fed up and fixing it! ################################################################# Here's a bit of GDB output to illustrate the specific fauilt that was constantly occurring before I fixed it: Program received signal SIGSEGV, Segmentation fault. 0x0805f131 in PlaceOntop (ontop=8, where=0) at menus.c:3756 3756 for (t = Scr->TwmRoot.next; t != NULL; t = t->next) { (gdb) where #0 0x0805f131 in PlaceOntop (ontop=8, where=0) at menus.c:3756 #1 0x0805f24b in RaiseWindow (tmp_win=0x83343a0) at menus.c:3787 #2 0x0806ab10 in AutoRaiseWindow (tmp=0x83343a0) at events.c:218 #3 0x0807096f in HandleEvents () at events.c:547 #4 0x0804e3a7 in main (argc=2, argv=0xbff491a4, environ=0xbff491b0) at ctwm.c:1027 (gdb) print Scr $2 = (ScreenInfo *) 0x0 ################################################################# To: Debian Bug Tracking System <sub...@bugs.debian.org> Date: Tue, 06 Mar 2012 15:42:25 -0500 Subject: debianBug#662860 - ctwm: SIGSEGV when changing workspaces http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=662860 Package: ctwm Version: 3.7-3.2 Severity: important Tags: upstream patch Dear Maintainer, I'm a longtime CTWM user who finally got tired of the random crashes that occur, typically when I'm switching workspaces. I can sometimes go for a month without seeing them and sometimes it happens several times a day. I've analyzed this to the point where I can see that code in DispatchEvent() is occasionally leaving the global Scr pointer NULL which causes a SIGSEGV on our next pass through the loop in HandleEvents(). I've provided a patch that adds a few lines of defensive code which seems to have improved the situation, though I have not analyzed the root cause, which appears to be that, for unknown reasons, either XFindContext() or FindScreenInfo() seem to be unable to return the answer expected of them. --Michael O'Donnell BEGIN PATCH: --- events.c.b0rken 2012-03-06 15:10:42.093677349 -0500 +++ events.c 2012-03-06 15:19:52.369161662 -0500 @@ -435,21 +435,25 @@ */ Bool DispatchEvent2 (void) { Window w = Event.xany.window; StashEventTime (&Event); + ScreenInfo *lastScr = Scr; /* XXX_MIKE - assume Scr OK on entry... */ if (XFindContext (dpy, w, TwmContext, (XPointer *) &Tmp_win) == XCNOENT) Tmp_win = NULL; if (XFindContext (dpy, w, ScreenContext, (XPointer *)&Scr) == XCNOENT) { Scr = FindScreenInfo (WindowOfEvent (&Event)); } dumpevent(&Event); - if (!Scr) return False; + if (!Scr) { + Scr = lastScr; /* XXX_MIKE - try not to leave Scr NULL */ + return False; + } if (Scr->Root != Scr->RealRoot) FixRootEvent (&Event); #ifdef SOUNDS play_sound(Event.type); #endif @@ -473,21 +477,25 @@ */ Bool DispatchEvent (void) { Window w = Event.xany.window; StashEventTime (&Event); + ScreenInfo *lastScr = Scr; /* XXX_MIKE - assume Scr OK on entry... */ if (XFindContext (dpy, w, TwmContext, (XPointer *) &Tmp_win) == XCNOENT) Tmp_win = NULL; if (XFindContext (dpy, w, ScreenContext, (XPointer *)&Scr) == XCNOENT) { Scr = FindScreenInfo (WindowOfEvent (&Event)); } dumpevent(&Event); - if (!Scr) return False; + if (!Scr) { + Scr = lastScr; /* XXX_MIKE - try not to leave Scr NULL */ + return False; + } if (captive) { if ((Event.type == ConfigureNotify) && (Event.xconfigure.window == Scr->CaptiveRoot)) { ConfigureRootWindow (&Event); return (False); END PATCH -- System Information: Debian Release: wheezy/sid APT prefers testing APT policy: (990, 'testing'), (500, 'unstable') Architecture: i386 (i686) Kernel: Linux 3.1.0 (SMP w/2 CPU cores) Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1) Shell: /bin/sh linked to /bin/bash Versions of packages ctwm depends on: ii libc6 2.13-26 ii libice6 2:1.0.7-2 ii libjpeg8 8d-1 ii librplay3 3.3.2-14 ii libsm6 2:1.2.0-2 ii libx11-6 2:1.4.4-4 ii libxext6 2:1.3.0-3 ii libxmu6 2:1.1.0-3 ii libxpm4 1:3.5.9-4 ii libxt6 1:1.1.1-2 ii m4 1.4.16-2 ii x11-common 1:7.6+11 ctwm recommends no packages. ctwm suggests no packages. -- Configuration Files: /etc/X11/ctwm/system.ctwmrc [Errno 2] No such file or directory: u'/etc/X11/ctwm/system.ctwmrc'