From 8ff8ec5b70da567f28b6e0aba1d09931bd680fb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 4 Mar 2024 16:29:04 +0100 Subject: [PATCH] sixel: fix row height calculation in resize_vertically() In resize_vertically(), we assumed a sixel is 6 pixels tall. This is mostly true, but not for non-1:1 sixels. Or, to be more precise, not for sixels where 'pan' != 1. This caused us to allocate too little backing memory, resulting in a crash when we later tried to write to the image. --- CHANGELOG.md | 2 ++ sixel.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82416455..9ceab4d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -131,6 +131,8 @@ * Pressing a modifier key while the kitty keyboard protocol is enabled no longer resets the viewport, or clears the selection. * Crash when failing to load an xcursor image ([#1624][1624]). +* Crash when resizing a dynamically sized sixel (no raster + attributes), with a non-1:1 aspect ratio. [1531]: https://codeberg.org/dnkl/foot/issues/1531 [1573]: https://codeberg.org/dnkl/foot/issues/1573 diff --git a/sixel.c b/sixel.c index c046145f..8ec72c15 100644 --- a/sixel.c +++ b/sixel.c @@ -1347,8 +1347,9 @@ resize_vertically(struct terminal *term, int new_height) uint32_t *old_data = term->sixel.image.data; const int width = term->sixel.image.width; const int old_height = term->sixel.image.height; + const int sixel_row_height = 6 * term->sixel.pan; - int alloc_height = (new_height + 6 - 1) / 6 * 6; + int alloc_height = (new_height + sixel_row_height - 1) / sixel_row_height * sixel_row_height; xassert(new_height > 0);