From a3f7420310be0fd778ef9fe2abf20edc2d8dc81a Mon Sep 17 00:00:00 2001 From: Tim Culverhouse Date: Sun, 18 Feb 2024 06:56:49 -0600 Subject: csi: check for private marker in 'S' case The handler for 'S' final character does not check for a private marker. This can cause a conflict with a sequence called 'XTSMGRAPHICS' which also has an 'S' final character, but uses the private marker '?'. Without checking for a private marker, st will perform a scroll up operation when XTSMGRAPHICS is seen, which can cause unexpected display artifacts. --- st.c | 1 + 1 file changed, 1 insertion(+) diff --git a/st.c b/st.c index d6478f5..034954d 100644 --- a/st.c +++ b/st.c @@ -1728,6 +1728,7 @@ csihandle(void) } break; case 'S': /* SU -- Scroll line up */ + if (csiescseq.priv) break; DEFAULT(csiescseq.arg[0], 1); tscrollup(term.top, csiescseq.arg[0]); break; -- cgit v1.2.3 From 7473a8d1a57e5f9aba41b953f4e498c35e1c9dc5 Mon Sep 17 00:00:00 2001 From: Quentin Rameau Date: Sun, 25 Feb 2024 01:31:31 +0100 Subject: Fix cursor move with wide glyphs st would always move back 1 column, even with wide glyhps (using more than a single column). The glyph rune is set on its first column, and the other ones are to 0, so loop until we detect the start of the previous glyph. --- st.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/st.c b/st.c index 034954d..77c3e8a 100644 --- a/st.c +++ b/st.c @@ -86,8 +86,8 @@ enum escape_state { typedef struct { Glyph attr; /* current char attributes */ - int x; - int y; + int x; /* terminal column */ + int y; /* terminal row */ char state; } TCursor; @@ -2175,12 +2175,16 @@ tstrsequence(uchar c) void tcontrolcode(uchar ascii) { + size_t i; + switch (ascii) { case '\t': /* HT */ tputtab(1); return; case '\b': /* BS */ - tmoveto(term.c.x-1, term.c.y); + for (i = 1; term.c.x && term.line[term.c.y][term.c.x - i].u == 0; ++i) + ; + tmoveto(term.c.x - i, term.c.y); return; case '\r': /* CR */ tmoveto(0, term.c.y); -- cgit v1.2.3 From 95f22c53059ccd60ee701ccf2659dacd95e4e89a Mon Sep 17 00:00:00 2001 From: Tommi Hirvola Date: Mon, 4 Mar 2024 12:56:30 +0200 Subject: set upper limit for REP escape sequence argument Previously, printf 'L\033[2147483647b' would call tputc('L') 2^31 times, making st unresponsive. This commit allows repeating the last character at most 65535 times in order to prevent freezing and DoS attacks. --- st.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/st.c b/st.c index 77c3e8a..683493d 100644 --- a/st.c +++ b/st.c @@ -1643,7 +1643,7 @@ csihandle(void) ttywrite(vtiden, strlen(vtiden), 0); break; case 'b': /* REP -- if last char is printable print it more times */ - DEFAULT(csiescseq.arg[0], 1); + LIMIT(csiescseq.arg[0], 1, 65535); if (term.lastc) while (csiescseq.arg[0]-- > 0) tputc(term.lastc); -- cgit v1.2.3 From f20e169a20f3ee761f7e09714f1d4c10916cf4c6 Mon Sep 17 00:00:00 2001 From: Hiltjo Posthuma Date: Sun, 17 Mar 2024 14:42:44 +0100 Subject: config.def.h: improve latency for the default configuration --- config.def.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 91ab8ca..2cd740a 100644 --- a/config.def.h +++ b/config.def.h @@ -53,7 +53,7 @@ int allowwindowops = 0; * near minlatency, but it waits longer for slow updates to avoid partial draw. * low minlatency will tear/flicker more, as it can "detect" idle too early. */ -static double minlatency = 8; +static double minlatency = 2; static double maxlatency = 33; /* -- cgit v1.2.3