From 82ba55b8f994ab30ff561a347b82ea340ba7075c Mon Sep 17 00:00:00 2001 From: "Thomas E. Dickey" 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