aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2022-07-03 12:45:50 +0200
committerNRK <nrk@disroot.org>2022-07-03 12:45:50 +0200
commit51d4c8dd4f793114cbc520f2a8465981bd1d4eaa (patch)
treea56c9062320425f33c67bf142143c803d19ce8d3
parent7c59cc7edc138e66c20837107a7021676e65be29 (diff)
downloadnsxiv-51d4c8dd4f793114cbc520f2a8465981bd1d4eaa.tar.zst
check for utf8_decode errors (#327)
utf8_decode() may return an errors, in which case the returned codepoint might be garbage. the issue can be tested by adding the following to `image-info` which produces invalid utf8 sequences: base64 -d << EOF 9JCAgPSQgIH0kICC9JCAg/SQgIT0kICF9JCAhvSQgIf0kICI9JCAifSQgIr0kICL9JCAjPSQgI30 kICO9JCAj/SQgJD0kICR9JCAkvSQgJP0kICU9JCAlfSQgJb0kICX9JCAmPSQgJn0kICa9JCAm/SQ gJz0kICd9JCAnvSQgJ8= EOF on my system, this leads to the statusbar being filled with empty boxes. check for returned error and skip the iteration. Reviewed-on: https://codeberg.org/nsxiv/nsxiv/pulls/327 Reviewed-by: Berke Kocaoğlu <berke.kocaoglu@metu.edu.tr>
-rw-r--r--window.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/window.c b/window.c
index f472474..1b3b6e0 100644
--- a/window.c
+++ b/window.c
@@ -407,7 +407,7 @@ void win_clear(win_t *win)
static int win_draw_text(win_t *win, XftDraw *d, const XftColor *color,
int x, int y, char *text, int len, int w)
{
- int err, tw = 0;
+ int err, tw = 0, warned = 0;
char *t, *next;
uint32_t rune;
XftFont *f;
@@ -415,7 +415,14 @@ static int win_draw_text(win_t *win, XftDraw *d, const XftColor *color,
XGlyphInfo ext;
for (t = text; t - text < len; t = next) {
+ err = 0;
next = utf8_decode(t, &rune, &err);
+ if (err) {
+ if (!warned)
+ error(0, 0, "error decoding utf8 status-bar text");
+ warned = 1;
+ continue;
+ }
if (XftCharExists(win->env.dpy, font, rune)) {
f = font;
} else { /* fallback font */