2024-12-07 - Adventures In Bitrot, xvi Crash Fix ================================================ I have been using xvi as my EDITOR on Alpine Linux. 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 tags: bencollver,retrocomputing,technical,unix Tags ==== bencollver retrocomputing technical unix