From 4d4df92f661c6756cffd2ab6bc7983c3f1ced8c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 3 May 2020 11:31:59 +0200 Subject: [PATCH] unicode-combining: limit maximum number of allowed composed chains --- terminal.h | 1 + vt.c | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/terminal.h b/terminal.h index 2767060b..395557db 100644 --- a/terminal.h +++ b/terminal.h @@ -217,6 +217,7 @@ struct terminal { struct grid *grid; #define COMB_CHARS_LO 0x40000000ul + #define COMB_CHARS_HI 0x400ffffful size_t composed_count; struct composed *composed; diff --git a/vt.c b/vt.c index 4ceaa25b..157f7a9c 100644 --- a/vt.c +++ b/vt.c @@ -681,12 +681,19 @@ action_utf8_print(struct terminal *term, uint8_t c) new_cc.combining[i] = composed->combining[i]; new_cc.combining[wanted_count - 1] = wc; - term->composed_count++; - term->composed = realloc(term->composed, term->composed_count * sizeof(term->composed[0])); - term->composed[term->composed_count - 1] = new_cc; + if (term->composed_count < COMB_CHARS_HI) { + term->composed_count++; + term->composed = realloc(term->composed, term->composed_count * sizeof(term->composed[0])); + term->composed[term->composed_count - 1] = new_cc; - term_print(term, COMB_CHARS_LO + term->composed_count - 1, base_width); - return; + term_print(term, COMB_CHARS_LO + term->composed_count - 1, base_width); + return; + } else { + /* We reached our maximum number of allowed composed + * character chains. Fall through here and print the + * current zero-width character to the current cell */ + LOG_WARN("maximum number of composed characters reached"); + } } }