Blame SOURCES/xterm-CVE-2021-27135.patch

349eff
diff --git a/button.c b/button.c
349eff
index ac1f742..4e8554d 100644
349eff
--- a/button.c
349eff
+++ b/button.c
349eff
@@ -3802,6 +3802,7 @@ SaltTextAway(XtermWidget xw,
349eff
     TScreen *screen = TScreenOf(xw);
349eff
     int i, j = 0;
349eff
     int eol;
349eff
+	size_t have = 0;
349eff
     Char *line;
349eff
     Char *lp;
349eff
     CELL first = *cellc;
349eff
@@ -3827,7 +3828,11 @@ SaltTextAway(XtermWidget xw,
349eff
 
349eff
     /* UTF-8 may require more space */
349eff
     if_OPT_WIDE_CHARS(screen, {
349eff
-	j *= 4;
349eff
+	if (j > 0) {
349eff
+	    if (screen->max_combining > 0)
349eff
+		j += screen->max_combining;
349eff
+	    j *= 6;
349eff
+	}
349eff
     });
349eff
 
349eff
     /* now get some memory to save it in */
349eff
@@ -3864,10 +3869,27 @@ SaltTextAway(XtermWidget xw,
349eff
     }
349eff
     *lp = '\0';			/* make sure we have end marked */
349eff
 
349eff
-    TRACE(("Salted TEXT:%d:%s\n", (int) (lp - line),
349eff
-	   visibleChars(line, (unsigned) (lp - line))));
349eff
+    have = (size_t) (lp - line);
349eff
+    /*
349eff
+     * Scanning the buffer twice is unnecessary.  Discard unwanted memory if
349eff
+     * the estimate is too-far off.
349eff
+     */
349eff
+    if ((have * 2) < (size_t) j) {
349eff
+		Char *next;
349eff
+		screen->selection_size = have + 1;
349eff
+		next = realloc(line, screen->selection_size);
349eff
+		if (next == NULL) {
349eff
+			free(line);
349eff
+			screen->selection_length = 0;
349eff
+			screen->selection_size = 0;
349eff
+		}
349eff
+		screen->selection_data = next;
349eff
+    }
349eff
+
349eff
+	screen->selection_length = have;
349eff
 
349eff
-    screen->selection_length = (unsigned long) (lp - line);
349eff
+    TRACE(("Salted TEXT:%u:%s\n", (unsigned) have,
349eff
+	   visibleChars(screen->selection_data, (unsigned) have)));
349eff
 }
349eff
 
349eff
 #if OPT_PASTE64