Go to file
Hiltjo Posthuma 818ec746f4 fix unicode glitch in DCS strings, patch by Tim Allen
Reported on the mailinglist:

"
I discovered recently that if an application running inside st tries to
send a DCS string, subsequent Unicode characters get messed up. For
example, consider the following test-case:

    printf '\303\277\033P\033\\\303\277'

...where:

  - \303\277 is the UTF-8 encoding of U+00FF LATIN SMALL LETTER Y WITH
    DIAERESIS (ÿ).
  - \033P is ESC P, the token that begins a DCS string.
  - \033\\ is ESC \, a token that ends a DCS string.
  - \303\277 is the same ÿ character again.

If I run the above command in a VTE-based terminal, or xterm, or
QTerminal, or pterm (PuTTY), I get the output:

    ÿÿ

...which is to say, the empty DCS string is ignored. However, if I run
that command inside st (as of commit 9ba7ecf), I get:

    ÿÿ

...where those last two characters are \303\277 interpreted as ISO8859-1
characters, instead of UTF-8.

I spent some time tracing through the state machines in st.c, and so far
as I can tell, this is how it works currently:

  - ESC P sets the "ESC_DCS" and "ESC_STR" flags, indicating that
    incoming bytes should be collected into the strescseq buffer, rather
    than being interpreted.
  - ESC \ sets the "ESC_STR_END" flag (when ESC is received), and then
    calls strhandle() (when \ is received) to interpret the collected
    bytes.
  - If the collected bytes begin with 'P' (i.e. if this was a DCS
    string) strhandle() sets the "ESC_DCS" flag again, confusing the
    state machine.

If my understanding is correct, fixing the problem should be as easy as
removing the line that sets ESC_DCS from strhandle():

diff --git a/st.c b/st.c
index ef8abd5..b5b805a 100644
--- a/st.c
+++ b/st.c
@@ -1897,7 +1897,6 @@ strhandle(void)
		xsettitle(strescseq.args[0]);
		return;
	case 'P': /* DCS -- Device Control String */
-		term.mode |= ESC_DCS;
	case '_': /* APC -- Application Program Command */
	case '^': /* PM -- Privacy Message */
		return;

I've tried the above patch and it fixes my problem, but I don't know if
it introduces any others.
"
2020-06-17 21:35:39 +02:00
FAQ FAQ: fix single-buffer patch 2020-06-01 14:09:46 +02:00
LEGACY LEGACY: typo. 2012-09-18 19:08:03 +02:00
LICENSE LICENSE: fix a few years 2018-03-14 20:08:00 +01:00
Makefile Makefile: fix dependencies on config.h 2019-01-04 12:33:01 +01:00
README tic -s -> tic -sx (Treat unknown capabilities as user-defined.) 2016-11-14 19:05:47 +01:00
TODO Remove old TODO entry. 2015-04-13 17:06:11 +02:00
arg.h don't modify argv, use a counter 2018-03-20 21:22:27 +01:00
config.def.h config.def.h: add an option allowwindowops, by default off (secure) 2020-05-30 22:06:15 +02:00
config.mk bump version to 0.8.3 2020-04-27 13:56:25 +02:00
st.1 Add support for scroll(1) 2020-04-11 15:23:20 +02:00
st.c fix unicode glitch in DCS strings, patch by Tim Allen 2020-06-17 21:35:39 +02:00
st.h config.def.h: add an option allowwindowops, by default off (secure) 2020-05-30 22:06:15 +02:00
st.info Partially add back in "support REP (repeat) escape sequence" 2020-05-30 22:04:28 +02:00
win.h better Input Method Editor (IME) support 2019-02-12 18:45:15 +01:00
x.c Call xsetcursor to set win.cursor in main 2020-05-24 13:45:42 +02:00

README

st - simple terminal
--------------------
st is a simple terminal emulator for X which sucks less.


Requirements
------------
In order to build st you need the Xlib header files.


Installation
------------
Edit config.mk to match your local setup (st is installed into
the /usr/local namespace by default).

Afterwards enter the following command to build and install st (if
necessary as root):

    make clean install


Running st
----------
If you did not install st with make clean install, you must compile
the st terminfo entry with the following command:

    tic -sx st.info

See the man page for additional details.

Credits
-------
Based on Aurélien APTEL <aurelien dot aptel at gmail dot com> bt source code.