dnkl/foot
41
2.0k
Fork
You've already forked foot
243

Heap-buffer-overflow in sixel_add_many_generic / sixel_add_many_ar_11 #2372

Open
opened 2026年05月25日 23:41:44 +02:00 by jackoftrade · 0 comments

Foot Version

1.27.0

TERM environment variable

foot

Compositor Name and Version

sway 1.11

Distribution

arch

Terminal multiplexer

No response

Shell, TUI, application

No response

Server/standalone mode

  • Standalone
  • Server

Foot config

default

Description of Bug and Steps to Reproduce

sixel.c:1708 and identically 1766:

if (unlikely(col + count - 1 >= width)) {
 resize_horizontally(term, col + count);
 count = min(count, max(width - col, 0));
 if (count == 0) return;
}
uint32_t *end = data + count;
for (; data < end; data++) ...

count is unsigned, col is int. The check runs unsigned. A DECGRI
repeat count where (col + count) wraps mod 2^32 to <= width passes
the check, skipping resize and clamp; data + count then runs off the
end of the image buffer and the loop writes past it.

PoC (31 bytes):

printf '033円Pq"2;0;200;200@@!4294967295@033円\\' | foot

Result: out-of-bounds write 4 bytes past the sixel image buffer.

Fix: do the comparison in 64-bit; clamp count by (width - col) before
the loop.

Note that this may already be addressed by one of the patches for the related issues.

Relevant logs, stacktraces, etc.

No response

### Foot Version 1.27.0 ### TERM environment variable foot ### Compositor Name and Version sway 1.11 ### Distribution arch ### Terminal multiplexer _No response_ ### Shell, TUI, application _No response_ ### Server/standalone mode - [ ] Standalone - [ ] Server ### Foot config ```ini default ``` ### Description of Bug and Steps to Reproduce sixel.c:1708 and identically 1766: if (unlikely(col + count - 1 >= width)) { resize_horizontally(term, col + count); count = min(count, max(width - col, 0)); if (count == 0) return; } uint32_t *end = data + count; for (; data < end; data++) ... count is unsigned, col is int. The check runs unsigned. A DECGRI repeat count where (col + count) wraps mod 2^32 to <= width passes the check, skipping resize and clamp; data + count then runs off the end of the image buffer and the loop writes past it. PoC (31 bytes): printf '033円Pq"2;0;200;200@@!4294967295@033円\\' | foot Result: out-of-bounds write 4 bytes past the sixel image buffer. Fix: do the comparison in 64-bit; clamp count by (width - col) before the loop. Note that this may already be addressed by one of the patches for the related issues. ### Relevant logs, stacktraces, etc. _No response_
Sign in to join this conversation.
No Branch/Tag specified
master
osc-5522
sixel-heap-buffer-overflow
releases/1.27
releases/1.26
releases/1.25
releases/1.24
multi-cursor
releases/1.23
pixman-16f-2
releases/1.22
releases/1.21
releases/1.20
releases/1.19
releases/1.18
releases/1.17
releases/1.16
releases/1.15
releases/1.14
releases/1.13
releases/1.12
releases/1.11
releases/1.10
releases/1.9
releases/1.8
releases/1.7
releases/1.6
releases/1.5
releases/1.4
releases/1.3
releases/1.2
releases/1.1
releases/1.0
1.27.0
1.26.1
1.26.0
1.25.0
1.24.0
1.23.1
1.23.0
1.22.3
1.22.2
1.22.1
1.22.0
1.21.0
1.20.2
1.20.1
1.20.0
1.19.0
1.18.1
1.18.0
1.17.2
1.17.1
1.17.0
1.16.2
1.16.1
1.16.0
1.15.3
1.15.2
1.15.1
1.15.0
1.14.0
1.13.1
1.13.0
1.12.1
1.12.0
1.11.0
1.10.3
1.10.2
1.10.1
1.10.0
1.9.2
1.9.1
1.9.0
1.8.2
1.8.1
1.8.0
1.7.2
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.0
1.2.3
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
0.9.0
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
dnkl/foot#2372
Reference in a new issue
dnkl/foot
No description provided.
Delete branch "%!s()"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?