Hi So I experienced this problems myself , this was roughly my journey.
I messed with fonts on my gentoo installing some from google some time after X would start crashing when surfing web. Eventually got lucky and found this website https://github.com/dylanaraps/neofetch that reproduces the crash reliably. (Culprit is the https://www.compart.com/en/unicode/U+1F5BC) Eventually traced the crash to dwm: fatal error: request code=138, error code=16 X Error of failed request: BadLength (poly request too large or internal Xlib length error) Major opcode of failed request: 138 (RENDER) Minor opcode of failed request: 20 (RenderAddGlyphs) Serial number of failed request: 1858 Current serial number in output stream: 1869 xinit: connection to X server lost which brought me here. I tried the patch from Igor but while it prevented the crash it left my dwm unusable. Wrote my own hack that removes non-ascii characters from the text written on the title bar (or any dwm text) and I am happy since. I am attaching my hack for reference but I do not think it's patch worthy as it removes the ability to have any national characters. Maybe I am an edge case but I was shocked to see dwm crashing given that it was otherwise rock solid for a decade+. I understand that the problem may lie with Xft and maybe that is what needs to be fixed, but it still kind of makes dwm look bad. I mean failure to render a glyph should never take down the Xorg - can anyone think of a more intelligent way to defend against this? My OS is gentoo - latest dwm and my Xorg and Xft are the latest in gentoo x11-libs/libXft 2.3.2-r1 x11-base/xorg-server 1.20.3 media-fonts/noto 20170403 (google fonts) Cheers Jakub
diff --git a/dwm.c b/dwm.c index 4465af1..dd9bbe2 100644 --- a/dwm.c +++ b/dwm.c @@ -899,23 +899,40 @@ getstate(Window w) return result; } +void +sub_non_ascii_chars(char *txt, unsigned int size) { + int i; + for (i = 0; i < size; i++){ + //fprintf(stderr, "%c at idx %d is %d\n", txt[i], i, txt[i]); + if (txt[i] > 127 || txt[i] < 0) { + txt[i] = '?'; + } + } + //fprintf(stderr, "OUT |%s|\n", txt); +} + int gettextprop(Window w, Atom atom, char *text, unsigned int size) { char **list = NULL; int n; XTextProperty name; + char buf[size-1]; if (!text || size == 0) return 0; text[0] = '\0'; if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems) return 0; - if (name.encoding == XA_STRING) - strncpy(text, (char *)name.value, size - 1); - else { + if (name.encoding == XA_STRING) { + strncpy(buf, (char *)name.value, size - 1); + sub_non_ascii_chars(buf, size-1); + strncpy(text, buf, size - 1); + } else { if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { - strncpy(text, *list, size - 1); + strncpy(buf, *list, size - 1); + sub_non_ascii_chars(buf, size -1); + strncpy(text, buf, size - 1); XFreeStringList(list); } }