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);
 		}
 	}

Reply via email to