2
0
mirror of git://git.proxmox.com/git/spiceterm.git synced 2025-08-22 02:07:24 +00:00

fix bound checking on cursor move

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>
This commit is contained in:
Dominik Csapak 2017-05-05 14:18:36 +02:00 committed by Dietmar Maurer
parent dd661f01eb
commit 5a100bddb6
2 changed files with 11 additions and 23 deletions

View 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 '`':

View 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