Fix techo handling of control and multibyte characters.
authornoname <noname@inventati.org>
Tue, 22 Apr 2014 20:26:07 +0000 (00:26 +0400)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Wed, 23 Apr 2014 18:31:45 +0000 (20:31 +0200)
techo compares signed char to '\x20'. Any character with code less then
'\x20' is treated as control character.  This way characters with MSB
set to 1 are considered control characters too.

Also this patch makes techo display DEL character as ^?.

To reprocuce the bug, enable echo mode using printf '\e[12l',
then type DEL character or any non-ASCII character.

st.c

diff --git a/st.c b/st.c
index aba034f..b66791a 100644 (file)
--- a/st.c
+++ b/st.c
@@ -2308,9 +2308,9 @@ techo(char *buf, int len) {
        for(; len > 0; buf++, len--) {
                char c = *buf;
 
-               if(c < '\x20') { /* control code */
+               if(c < 0x20 || c == 0177) { /* control code */
                        if(c != '\n' && c != '\r' && c != '\t') {
-                               c |= '\x40';
+                               c ^= '\x40';
                                tputc("^", 1);
                        }
                        tputc(&c, 1);