From bd8c936b00c0f17558d6f96a92e551ffe501e6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 8 May 2021 15:17:55 +0200 Subject: [PATCH 1/3] term: osc8-open: assert URI in VT struct is NULL --- terminal.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/terminal.c b/terminal.c index ab82b75b..6ec37406 100644 --- a/terminal.c +++ b/terminal.c @@ -3070,6 +3070,8 @@ term_osc8_open(struct terminal *term, uint64_t id, const char *uri) term_osc8_close(term); } + xassert(term->vt.osc8.uri == NULL); + term->vt.osc8.begin = (struct coord){ .col = term->grid->cursor.point.col, .row = grid_row_absolute(term->grid, term->grid->cursor.point.row), From bfd3eb47ec164b289c0da812817629236acdc43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 8 May 2021 15:18:25 +0200 Subject: [PATCH 2/3] term: reset: fix reset of the VT struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Free buffers and strings 2. memset() the vt struct 3. re-initialize members that must not be zero We _could_ replace the memset() with explicit zeroing of all the members. It’s just that there’s a lot of arrays, so this is much easier. Closes #495 --- CHANGELOG.md | 3 +++ terminal.c | 11 +++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e074583b..c5a37d82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,9 @@ resulting in PGO build failures. * Wrong colors in the 256-color cube (https://codeberg.org/dnkl/foot/issues/479). +* Memory leak triggered by “opening” an OSC-8 URI and then resetting + the terminal without closing the URI + (https://codeberg.org/dnkl/foot/issues/495). ### Security diff --git a/terminal.c b/terminal.c index 6ec37406..9704b891 100644 --- a/terminal.c +++ b/terminal.c @@ -1649,13 +1649,12 @@ term_reset(struct terminal *term, bool hard) term->scroll_region.start = 0; term->scroll_region.end = term->rows; - free(term->vt.osc.data); - memset(&term->vt, 0, sizeof(term->vt)); - term->vt.state = 0; /* GROUND */ - - term->vt.osc8.begin = (struct coord){-1, -1}; free(term->vt.osc8.uri); - term->vt.osc8.uri = NULL; + free(term->vt.osc.data); + + memset(&term->vt, 0, sizeof(term->vt)); + term->vt.state = 0; /* STATE_GROUND */ + term->vt.osc8.begin = (struct coord){-1, -1}; if (term->grid == &term->alt) { term->grid = &term->normal; From f3b3bc1f711941096886f752a4272d1990409243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 8 May 2021 19:07:37 +0200 Subject: [PATCH 3/3] term: reset: combine memset+initializers of vt struct --- terminal.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/terminal.c b/terminal.c index 9704b891..f3513a08 100644 --- a/terminal.c +++ b/terminal.c @@ -1652,9 +1652,10 @@ term_reset(struct terminal *term, bool hard) free(term->vt.osc8.uri); free(term->vt.osc.data); - memset(&term->vt, 0, sizeof(term->vt)); - term->vt.state = 0; /* STATE_GROUND */ - term->vt.osc8.begin = (struct coord){-1, -1}; + term->vt = (struct vt){ + .state = 0, /* STATE_GROUND */ + .osc8 = {.begin = (struct coord){-1, -1}}, + }; if (term->grid == &term->alt) { term->grid = &term->normal;