From 67a228bf4b8b826544c13dac561e4965750465d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 19 Mar 2022 20:22:59 +0100 Subject: [PATCH] dcs: xtgettcap: use custom put() handler Grow buffer exponentially, since XTGETTCAP requests can, theoretically, be very large. --- dcs.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/dcs.c b/dcs.c index 7aecfb26..c1bab202 100644 --- a/dcs.c +++ b/dcs.c @@ -16,17 +16,14 @@ ensure_size(struct terminal *term, size_t required_size) if (required_size <= term->vt.dcs.size) return true; - size_t new_size = (required_size + 127) / 128 * 128; - xassert(new_size > 0); - - uint8_t *new_data = realloc(term->vt.dcs.data, new_size); + uint8_t *new_data = realloc(term->vt.dcs.data, required_size); if (new_data == NULL) { LOG_ERRNO("failed to increase size of DCS buffer"); return false; } term->vt.dcs.data = new_data; - term->vt.dcs.size = new_size; + term->vt.dcs.size = required_size; return true; } @@ -180,6 +177,24 @@ out: free(name); } +static void +xtgettcap_put(struct terminal *term, uint8_t c) +{ + struct vt *vt = &term->vt; + + /* Grow buffer expontentially */ + if (vt->dcs.idx >= vt->dcs.size) { + size_t new_size = vt->dcs.size * 2; + if (new_size == 0) + new_size = 128; + + if (!ensure_size(term, new_size)) + return; + } + + vt->dcs.data[vt->dcs.idx++] = c; +} + static void xtgettcap_unhook(struct terminal *term) { @@ -445,6 +460,7 @@ dcs_hook(struct terminal *term, uint8_t final) case '+': switch (final) { case 'q': /* XTGETTCAP */ + term->vt.dcs.put_handler = &xtgettcap_put; term->vt.dcs.unhook_handler = &xtgettcap_unhook; break; }