5
0
mirror of git://git.proxmox.com/git/vncterm.git synced 2025-01-10 09:17:38 +03: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:19:06 +02:00 committed by Dietmar Maurer
parent bdbcef679d
commit 8392857fa7
2 changed files with 11 additions and 23 deletions

View File

@ -1405,10 +1405,7 @@ vncterm_putchar (vncTerm *vt, unicode 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;
}
vncterm_gotoxy (vt, vt->cx, vt->cy - vt->esc_buf[0]);
break;
case 'B':
case 'e':
@ -1416,10 +1413,7 @@ vncterm_putchar (vncTerm *vt, unicode 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;
}
vncterm_gotoxy (vt, vt->cx, vt->cy + vt->esc_buf[0]);
break;
case 'C':
case 'a':
@ -1427,20 +1421,14 @@ vncterm_putchar (vncTerm *vt, unicode 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;
}
vncterm_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;
}
vncterm_gotoxy (vt, vt->cx - vt->esc_buf[0], vt->cy);
break;
case 'G':
case '`':

View File

@ -48,19 +48,19 @@ typedef struct vncTerm {
// 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