From 82ba55b8f994ab30ff561a347b82ea340ba7075c Mon Sep 17 00:00:00 2001
From: "Thomas E. Dickey" <dickey@invisible-island.net>
Date: Tue, 9 Feb 2021 23:04:41 +0000
Subject: [PATCH] snapshot of project "xterm", label xterm-365d

--- a/button.c
+++ b/button.c
@@ -3669,6 +3669,7 @@
 {
     TScreen *screen = TScreenOf(xw);
     int i, j = 0;
+    size_t have = 0;
     int eol;
     Char *line;
     Char *lp;
@@ -3695,7 +3696,11 @@
 
     /* UTF-8 may require more space */
     if_OPT_WIDE_CHARS(screen, {
-	j *= 4;
+      if (j > 0) {
+        if (screen->max_combining > 0)
+          j += screen->max_combining;
+        j *= 6;
+      }
     });
 
     /* now get some memory to save it in */
@@ -3732,10 +3737,20 @@
     }
     *lp = '\0';			/* make sure we have end marked */
 
-    TRACE(("Salted TEXT:%d:%s\n", (int) (lp - line),
-	   visibleChars(line, (unsigned) (lp - line))));
+    have = (size_t) (lp - line);
+    /*
+     * Scanning the buffer twice is unnecessary.  Discard unwanted memory if
+     * the estimate is too-far off.
+     */
+     if ((have * 2) < (size_t) j) {
+       screen->selection_size = have + 1;
+       line = realloc(line, screen->selection_size);
+     }
 
-    screen->selection_length = (unsigned long) (lp - line);
+    TRACE(("Salted TEXT:%d:%s\n", (int) have,
+      visibleChars(line, (unsigned) have)));
+
+    screen->selection_length = (unsigned long) have;
 }
 
 #if OPT_PASTE64
