aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRian Hunter <rian+suckless-dev@thelig.ht>2015-01-29 15:06:43 -0800
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2015-02-05 20:28:00 +0100
commit4d14d97547d335974e98aa612ac5b4fcfc25e1d9 (patch)
tree677ec4cccaefeecf7f981e0bae67c98bb00a1e5c
parent708b697ed77e1ba4e96399ed6cb0f73a37565321 (diff)
downloadst-4d14d97547d335974e98aa612ac5b4fcfc25e1d9.tar.gz
st-4d14d97547d335974e98aa612ac5b4fcfc25e1d9.tar.bz2
st-4d14d97547d335974e98aa612ac5b4fcfc25e1d9.zip
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().
-rw-r--r--st.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/st.c b/st.c
index db9a332..6a68c3c 100644
--- a/st.c
+++ b/st.c
@@ -2673,13 +2673,16 @@ tputc(char *c, int len) {
if(IS_SET(MODE_WRAP) && (term.c.state & CURSOR_WRAPNEXT)) {
gp->mode |= ATTR_WRAP;
tnewline(1);
+ gp = &term.line[term.c.y][term.c.x];
}
if(IS_SET(MODE_INSERT) && term.c.x+1 < term.col)
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);
+ gp = &term.line[term.c.y][term.c.x];
+ }
tsetchar(c, &term.c.attr, term.c.x, term.c.y);