Fix crash due to wide characters

In tputc(), when a character wasn't large enough to fit
on the current line, we would call tnewline() to place it on
the next line. Unfortunately, we weren't resetting our glyph
pointer and this caused memory corruption when a
wide character (width == 2) was being written. This patch
resets our glyph pointer after calls to tnewline().
dev
Rian Hunter 2015-01-29 15:06:43 -08:00 committed by Roberto E. Vargas Caballero
parent 708b697ed7
commit 4d14d97547
1 changed files with 4 additions and 1 deletions

5
st.c
View File

@ -2673,13 +2673,16 @@ tputc(char *c, int len) {
if(IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) { if(IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) {
gp->mode |= ATTR_WRAP; gp->mode |= ATTR_WRAP;
tnewline(1); tnewline(1);
gp = &term.line[term.c.y][term.c.x];
} }
if(IS_SET(MODE_INSERT) && term.c.x+1 < term.col) if(IS_SET(MODE_INSERT) && term.c.x+1 < term.col)
memmove(gp+1, gp, (term.col - term.c.x - 1) * sizeof(Glyph)); memmove(gp+1, gp, (term.col - term.c.x - 1) * sizeof(Glyph));
if(term.c.x+width > term.col) if(term.c.x+width > term.col) {
tnewline(1); tnewline(1);
gp = &term.line[term.c.y][term.c.x];
}
tsetchar(c, &term.c.attr, term.c.x, term.c.y); tsetchar(c, &term.c.attr, term.c.x, term.c.y);