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>
This commit is contained in:
parent
7c59cc7edc
commit
51d4c8dd4f
9
window.c
9
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,
|
static int win_draw_text(win_t *win, XftDraw *d, const XftColor *color,
|
||||||
int x, int y, char *text, int len, int w)
|
int x, int y, char *text, int len, int w)
|
||||||
{
|
{
|
||||||
int err, tw = 0;
|
int err, tw = 0, warned = 0;
|
||||||
char *t, *next;
|
char *t, *next;
|
||||||
uint32_t rune;
|
uint32_t rune;
|
||||||
XftFont *f;
|
XftFont *f;
|
||||||
|
@ -415,7 +415,14 @@ static int win_draw_text(win_t *win, XftDraw *d, const XftColor *color,
|
||||||
XGlyphInfo ext;
|
XGlyphInfo ext;
|
||||||
|
|
||||||
for (t = text; t - text < len; t = next) {
|
for (t = text; t - text < len; t = next) {
|
||||||
|
err = 0;
|
||||||
next = utf8_decode(t, &rune, &err);
|
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)) {
|
if (XftCharExists(win->env.dpy, font, rune)) {
|
||||||
f = font;
|
f = font;
|
||||||
} else { /* fallback font */
|
} else { /* fallback font */
|
||||||
|
|
Loading…
Reference in a new issue