浏览代码

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().
Rian Hunter 10 年之前
父节点
当前提交
4d14d97547
共有 1 个文件被更改,包括 4 次插入1 次删除
  1. 4 1
      st.c

+ 4 - 1
st.c

@@ -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);