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 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

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


Reply via email to