On Thu, Jun 18, 2020 at 02:05:19AM +1000, Tim Allen wrote:
> 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.
> 

Hi Tim,

Thanks for the detailed report and the patch. It looks good to me and I pushed
it to master.

-- 
Kind regards,
Hiltjo

Reply via email to