URI: 
  TEXT View source
       
       # 2024-12-07 - Adventures In Bitrot, xvi Crash Fix
       
       I have been using xvi as my EDITOR on Alpine Linux.
       
  HTML xvi
       
       I log in in over the serial port from my FreeDOS desktop.  When my
       serial port speed is 9600 baud, everything works fine.  When the
       speed is 115200 baud, xvi crashes.
       
           $ xvi
           Segmentation fault
       
       GDB reveals something in xvi-2.50.3/src/unix.c at line 576.
       
           ospeed = cfgetospeed(&cooked_state);
       
       When the baud rate is 115200, ospeed is set to 4098.  The crash
       actually happens in GNU termcap, in termcap-1.3.1/termcap.c at
       line 336.
       
           speed = speeds[ospeed];
       
       The array range is from 0 to 18.  When ospeed is 4098, it is way out
       of bounds.  I fixed this with the following local change.
       
           --- xvi-2.50.3/src/unix.c.orig
           +++ xvi-2.50.3/src/unix.c
           @@ -574,6 +574,10 @@
            #ifdef        TERMIO
            #   ifdef        POSIX
                    ospeed = cfgetospeed(&cooked_state);
           +        if (ospeed > 18) {
           +                /* GNU termcap can't handle large values */
           +                ospeed = 0;
           +        }
            #   else        /* not POSIX */
                    ospeed = speeds[cooked_state.c_cflag & CBAUD];
            #   endif
       
  TEXT gopher://tilde.pink/0/~bencollver/log/2024-12-07-adventures-in-bitrot-xvi-crash-fix/xvi.diff
       
       tags: bencollver,retrocomputing,technical,unix
       
       # Tags
       
   DIR bencollver
   DIR retrocomputing
   DIR technical
   DIR unix