]> git.armaanb.net Git - st.git/commitdiff
Simplify tdeletechar and tinsertblank and fix memory corruption.
authornoname <noname@inventati.org>
Tue, 22 Apr 2014 22:08:13 +0000 (02:08 +0400)
committerRoberto E. Vargas Caballero <k0ga@shike2.com>
Fri, 25 Apr 2014 15:17:48 +0000 (17:17 +0200)
Current CSI parsing code uses strtol to parse arguments and allows them
to be negative. Negative argument is not properly handled in tdeletechar
and tinsertblank and results in memory corruption in memmove.

Reproduce with printf '\e[-500@'

Patch also removes special handling for corner case and simplifies
the code.

Removed
term.dirty[term.c.y] = 1
because tclearregion sets dirty flag.

st.c

diff --git a/st.c b/st.c
index 60243a7375fe6ec1fadb34728d4a1ed1f0c35c8a..263abaa50406b11f350de910bb39f4a944115638 100644 (file)
--- a/st.c
+++ b/st.c
@@ -1586,37 +1586,31 @@ tclearregion(int x1, int y1, int x2, int y2) {
 
 void
 tdeletechar(int n) {
-       int src = term.c.x + n;
-       int dst = term.c.x;
-       int size = term.col - src;
+       int dst, src, size;
 
-       term.dirty[term.c.y] = 1;
+       LIMIT(n, 0, term.col - term.c.x);
 
-       if(src >= term.col) {
-               tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
-               return;
-       }
+       dst = term.c.x;
+       src = term.c.x + n;
+       size = term.col - src;
 
        memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src],
-                       size * sizeof(Glyph));
+               size * sizeof(Glyph));
        tclearregion(term.col-n, term.c.y, term.col-1, term.c.y);
 }
 
 void
 tinsertblank(int n) {
-       int src = term.c.x;
-       int dst = src + n;
-       int size = term.col - dst;
+       int dst, src, size;
 
-       term.dirty[term.c.y] = 1;
+       LIMIT(n, 0, term.col - term.c.x);
 
-       if(dst >= term.col) {
-               tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
-               return;
-       }
+       dst = term.c.x + n;
+       src = term.c.x;
+       size = term.col - dst;
 
        memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src],
-                       size * sizeof(Glyph));
+               size * sizeof(Glyph));
        tclearregion(src, term.c.y, dst - 1, term.c.y);
 }