aboutsummaryrefslogtreecommitdiff
path: root/st.c
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 /st.c
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().
Diffstat (limited to 'st.c')
-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);