]> git.proxmox.com Git - spiceterm.git/commitdiff
fix bound checking on cursor move
authorDominik Csapak <d.csapak@proxmox.com>
Fri, 5 May 2017 12:18:36 +0000 (14:18 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Sat, 6 May 2017 06:11:39 +0000 (08:11 +0200)
changing most of the vt struct fields to unsigned, to avoid undefined
behaviour and use gotoxy for moving the cursor to correctly bound check
the cursor position

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
spiceterm.c
spiceterm.h

index bcb38c6593c0105cee5ded71b10a9514085bbc9f..fdcafbc60670a7124af475344edcf9074379ede9 100644 (file)
@@ -865,10 +865,7 @@ spiceterm_putchar(spiceTerm *vt, gunichar2 ch)
             if (vt->esc_buf[0] == 0) {
                 vt->esc_buf[0] = 1;
             }
-            vt->cy -= vt->esc_buf[0];
-            if (vt->cy < 0) {
-                vt->cy = 0;
-            }
+            spiceterm_gotoxy(vt, vt->cx, vt->cy - vt->esc_buf[0]);
             break;
         case 'B':
         case 'e':
@@ -876,10 +873,7 @@ spiceterm_putchar(spiceTerm *vt, gunichar2 ch)
             if (vt->esc_buf[0] == 0) {
                 vt->esc_buf[0] = 1;
             }
-            vt->cy += vt->esc_buf[0];
-            if (vt->cy >= vt->height) {
-                vt->cy = vt->height - 1;
-            }
+            spiceterm_gotoxy(vt, vt->cx, vt->cy + vt->esc_buf[0]);
             break;
         case 'C':
         case 'a':
@@ -887,20 +881,14 @@ spiceterm_putchar(spiceTerm *vt, gunichar2 ch)
             if (vt->esc_buf[0] == 0) {
                 vt->esc_buf[0] = 1;
             }
-            vt->cx += vt->esc_buf[0];
-            if (vt->cx >= vt->width) {
-                vt->cx = vt->width - 1;
-            }
+            spiceterm_gotoxy(vt, vt->cx + vt->esc_buf[0], vt->cy);
             break;
         case 'D':
             /* move cursor left */
             if (vt->esc_buf[0] == 0) {
                 vt->esc_buf[0] = 1;
             }
-            vt->cx -= vt->esc_buf[0];
-            if (vt->cx < 0) {
-                vt->cx = 0;
-            }
+            spiceterm_gotoxy(vt, vt->cx - vt->esc_buf[0], vt->cy);
             break;
         case 'G':
         case '`':
index 7993c6aa01318fd4a83fe065b7e3f9373115ea8c..0e238ca8d924d457fb605ff295b6bb827628513d 100644 (file)
@@ -112,19 +112,19 @@ typedef struct spiceTerm {
     // cursor
     TextAttributes cur_attrib;
     TextAttributes cur_attrib_saved;
-    int tty_state; // 0 - normal, 1 - ESC, 2 - CSI
+    unsigned int tty_state; // 0 - normal, 1 - ESC, 2 - CSI
     int cx; // cursor x position
     int cy; // cursor y position
     int cx_saved; // saved cursor x position
     int cy_saved; // saved cursor y position
-    int esc_buf[MAX_ESC_PARAMS];
-    int esc_count;
-    int esc_ques;
-    int esc_has_par;
+    unsigned int esc_buf[MAX_ESC_PARAMS];
+    unsigned int esc_count;
+    unsigned int esc_ques;
+    unsigned int esc_has_par;
     char osc_textbuf[4096];
     char osc_cmd;
-    int region_top;
-    int region_bottom;
+    unsigned int region_top;
+    unsigned int region_bottom;
 
     unsigned int charset:1; // G0 or G1
     unsigned int charset_saved:1; // G0 or G1