mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-03 07:15:29 -04:00
Merge branch 'sixel-heap-user-after-free-after-blending'
This commit is contained in:
commit
c1cde66f70
1 changed files with 10 additions and 12 deletions
22
sixel.c
22
sixel.c
|
|
@ -964,16 +964,7 @@ sixel_unhook(struct terminal *term)
|
||||||
(term->sixel.image.height + term->cell_height - 1) / term->cell_height +
|
(term->sixel.image.height + term->cell_height - 1) / term->cell_height +
|
||||||
(term->sixel.cursor_right_of_graphics ? 0 : 1);
|
(term->sixel.cursor_right_of_graphics ? 0 : 1);
|
||||||
|
|
||||||
/* Will we be emitting anything at all? */
|
bool free_image_data = true;
|
||||||
const bool no_emission =
|
|
||||||
rows_needed > term->grid->num_rows ||
|
|
||||||
pixel_rows_left == 0 ||
|
|
||||||
rows_avail == 0;
|
|
||||||
|
|
||||||
if (no_emission) {
|
|
||||||
/* We won’t be emitting any sixels - free backing image */
|
|
||||||
free(term->sixel.image.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We do not allow sixels to cross the scrollback wrap-around, as
|
/* We do not allow sixels to cross the scrollback wrap-around, as
|
||||||
* this makes intersection calculations much more complicated */
|
* this makes intersection calculations much more complicated */
|
||||||
|
|
@ -991,9 +982,13 @@ sixel_unhook(struct terminal *term)
|
||||||
const int height = min(pixel_rows_left, pixel_rows_avail);
|
const int height = min(pixel_rows_left, pixel_rows_avail);
|
||||||
|
|
||||||
uint32_t *img_data;
|
uint32_t *img_data;
|
||||||
if (pixel_row_idx == 0)
|
if (pixel_row_idx == 0 && height == pixel_rows_left) {
|
||||||
|
/* Entire image will be emitted as a single chunk - reuse
|
||||||
|
* the source buffer */
|
||||||
img_data = term->sixel.image.data;
|
img_data = term->sixel.image.data;
|
||||||
else {
|
free_image_data = false;
|
||||||
|
} else {
|
||||||
|
xassert(free_image_data);
|
||||||
img_data = xmalloc(height * stride);
|
img_data = xmalloc(height * stride);
|
||||||
memcpy(
|
memcpy(
|
||||||
img_data,
|
img_data,
|
||||||
|
|
@ -1080,6 +1075,9 @@ sixel_unhook(struct terminal *term)
|
||||||
start_row -= image.rows;
|
start_row -= image.rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (free_image_data)
|
||||||
|
free(term->sixel.image.data);
|
||||||
|
|
||||||
term->sixel.image.data = NULL;
|
term->sixel.image.data = NULL;
|
||||||
term->sixel.image.width = 0;
|
term->sixel.image.width = 0;
|
||||||
term->sixel.image.height = 0;
|
term->sixel.image.height = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue