summaryrefslogtreecommitdiffstats
path: root/debian/patches/upstream-aa17f0e0c1.diff
blob: deb8e6a3363e90589dd1a398c9340b92058e7a17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
commit aa17f0e0c1c8b3f1d6fc8617613c74f07de66fae
Author: Nicholas Marriott <nicholas.marriott@gmail.com>
Date:   Thu Mar 21 11:37:09 2024 +0000

    Fix crash if SIXEL colour register is invalid and remove SIXEL images before
    reflow to avoid a different crash, from Anindya Mukherjee.

Origin: upstream, https://github.com/tmux/tmux/commit/aa17f0e0c1c8b3f1d6fc8617613c74f07de66fae

diff --git a/image-sixel.c b/image-sixel.c
index 3396a22a7f..e23d17f902 100644
--- a/image-sixel.c
+++ b/image-sixel.c
@@ -489,6 +489,9 @@ sixel_print(struct sixel_image *si, struct sixel_image *map, size_t *size)
 		colours = si->colours;
 		ncolours = si->ncolours;
 	}
+
+	if (ncolours == 0)
+		return (NULL);
 	contains = xcalloc(1, ncolours);
 
 	len = 8192;
diff --git a/input.c b/input.c
index eb421b280e..e6016121ff 100644
--- a/input.c
+++ b/input.c
@@ -1839,7 +1839,7 @@ input_csi_dispatch_sm_private(struct input_ctx *ictx)
 
 /* Handle CSI graphics SM. */
 static void
-input_csi_dispatch_sm_graphics(struct input_ctx *ictx)
+input_csi_dispatch_sm_graphics(__unused struct input_ctx *ictx)
 {
 #ifdef ENABLE_SIXEL
 	int	n, m, o;
diff --git a/screen-write.c b/screen-write.c
index 6892d04149..a732f093dc 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -2283,6 +2283,10 @@ screen_write_sixelimage(struct screen_write_ctx *ctx, struct sixel_image *si,
 		new = sixel_scale(si, 0, 0, 0, y - sy, sx, sy, 1);
 		sixel_free(si);
 		si = new;
+
+		/* Bail out if the image cannot be scaled. */
+		if (si == NULL)
+			return;
 		sixel_size_in_cells(si, &x, &y);
 	}
 
diff --git a/screen.c b/screen.c
index f73a850547..0eaf469886 100644
--- a/screen.c
+++ b/screen.c
@@ -308,12 +308,12 @@ screen_resize_cursor(struct screen *s, u_int sx, u_int sy, int reflow,
 	if (sy != screen_size_y(s))
 		screen_resize_y(s, sy, eat_empty, &cy);
 
-	if (reflow) {
 #ifdef ENABLE_SIXEL
-		image_free_all(s);
+	image_free_all(s);
 #endif
+
+	if (reflow)
 		screen_reflow(s, sx, &cx, &cy, cursor);
-	}
 
 	if (cy >= s->grid->hsize) {
 		s->cx = cx;