Compare commits

...

4 Commits
3.6a ... 3.6b

Author SHA1 Message Date
Nicholas Marriott
0623d1e968 Bump version. 2026-05-20 16:39:41 +01:00
Nicholas Marriott
c5fb5e8bb0 Update CHANGES. 2026-05-20 12:17:30 +01:00
Nicholas Marriott
b8434182c9 Track which list (images or saved_images) each image is on so they can be
removed from the correct list when the total image count is reached. Fixes
crash reported by xlabai at tencent dot com.
2026-05-20 12:15:34 +01:00
Nicholas Marriott
e1f942f26a Add a define for max images and bump to 20 for the moment. 2026-05-20 12:14:22 +01:00
5 changed files with 26 additions and 7 deletions

View File

@@ -1,3 +1,8 @@
CHANGES FROM 3.6a TO 3.6b
* Remove images from the correct list when they are removed while in the
alternate screen (reported by xlabai at tencent dot com).
CHANGES FROM 3.6 TO 3.6a CHANGES FROM 3.6 TO 3.6a
* Fix a buffer overread and an infinite loop in format processing (reported by * Fix a buffer overread and an infinite loop in format processing (reported by

View File

@@ -1,6 +1,6 @@
# configure.ac # configure.ac
AC_INIT([tmux], 3.6a) AC_INIT([tmux], 3.6b)
AC_PREREQ([2.60]) AC_PREREQ([2.60])
AC_CONFIG_AUX_DIR(etc) AC_CONFIG_AUX_DIR(etc)

View File

@@ -25,6 +25,7 @@
static struct images all_images = TAILQ_HEAD_INITIALIZER(all_images); static struct images all_images = TAILQ_HEAD_INITIALIZER(all_images);
static u_int all_images_count; static u_int all_images_count;
#define MAX_IMAGE_COUNT 20
static void static void
image_free(struct image *im) image_free(struct image *im)
@@ -34,7 +35,7 @@ image_free(struct image *im)
TAILQ_REMOVE(&all_images, im, all_entry); TAILQ_REMOVE(&all_images, im, all_entry);
all_images_count--; all_images_count--;
TAILQ_REMOVE(&s->images, im, entry); TAILQ_REMOVE(im->list, im, entry);
sixel_free(im->data); sixel_free(im->data);
free(im->fallback); free(im->fallback);
free(im); free(im);
@@ -108,10 +109,11 @@ image_store(struct screen *s, struct sixel_image *si)
image_fallback(&im->fallback, im->sx, im->sy); image_fallback(&im->fallback, im->sx, im->sy);
TAILQ_INSERT_TAIL(&s->images, im, entry); im->list = &s->images;
TAILQ_INSERT_TAIL(im->list, im, entry);
TAILQ_INSERT_TAIL(&all_images, im, all_entry); TAILQ_INSERT_TAIL(&all_images, im, all_entry);
if (++all_images_count == 10/*XXX*/) if (++all_images_count == MAX_IMAGE_COUNT)
image_free(TAILQ_FIRST(&all_images)); image_free(TAILQ_FIRST(&all_images));
return (im); return (im);

View File

@@ -633,7 +633,10 @@ screen_reflow(struct screen *s, u_int new_x, u_int *cx, u_int *cy, int cursor)
void void
screen_alternate_on(struct screen *s, struct grid_cell *gc, int cursor) screen_alternate_on(struct screen *s, struct grid_cell *gc, int cursor)
{ {
u_int sx, sy; u_int sx, sy;
#ifdef ENABLE_SIXEL
struct image *im;
#endif
if (SCREEN_IS_ALTERNATE(s)) if (SCREEN_IS_ALTERNATE(s))
return; return;
@@ -650,6 +653,8 @@ screen_alternate_on(struct screen *s, struct grid_cell *gc, int cursor)
#ifdef ENABLE_SIXEL #ifdef ENABLE_SIXEL
TAILQ_CONCAT(&s->saved_images, &s->images, entry); TAILQ_CONCAT(&s->saved_images, &s->images, entry);
TAILQ_FOREACH(im, &s->saved_images, entry)
im->list = &s->saved_images;
#endif #endif
grid_view_clear(s->grid, 0, 0, sx, sy, 8); grid_view_clear(s->grid, 0, 0, sx, sy, 8);
@@ -662,7 +667,10 @@ screen_alternate_on(struct screen *s, struct grid_cell *gc, int cursor)
void void
screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor) screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor)
{ {
u_int sx = screen_size_x(s), sy = screen_size_y(s); u_int sx = screen_size_x(s), sy = screen_size_y(s);
#ifdef ENABLE_SIXEL
struct image *im;
#endif
/* /*
* If the current size is different, temporarily resize to the old size * If the current size is different, temporarily resize to the old size
@@ -709,6 +717,8 @@ screen_alternate_off(struct screen *s, struct grid_cell *gc, int cursor)
#ifdef ENABLE_SIXEL #ifdef ENABLE_SIXEL
image_free_all(s); image_free_all(s);
TAILQ_CONCAT(&s->images, &s->saved_images, entry); TAILQ_CONCAT(&s->images, &s->saved_images, entry);
TAILQ_FOREACH(im, &s->images, entry)
im->list = &s->images;
#endif #endif
if (s->cx > screen_size_x(s) - 1) if (s->cx > screen_size_x(s) - 1)

4
tmux.h
View File

@@ -936,8 +936,10 @@ struct image {
u_int sx; u_int sx;
u_int sy; u_int sy;
TAILQ_ENTRY (image) all_entry; struct images *list;
TAILQ_ENTRY (image) entry; TAILQ_ENTRY (image) entry;
TAILQ_ENTRY (image) all_entry;
}; };
TAILQ_HEAD(images, image); TAILQ_HEAD(images, image);
#endif #endif