| View source | |
| # 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 | |
| gopher://tilde.pink/0/~bencollver/log/2024-12-07-adventures-in-bitrot-xvi-crash… | |
| tags: bencollver,retrocomputing,technical,unix | |
| # Tags | |
| bencollver | |
| retrocomputing | |
| technical | |
| unix |