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'

Reply via email to