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

DoS / OOM: XTPUSHCOLORS slot #2362

Closed
opened 2026年05月24日 13:12:20 +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

A program that writes to the terminal can crash foot or force a multi-
GB allocation with a single ~16-byte escape sequence:

printf '033円[2147483647#P' # aborts foot (xrealloc fails)
printf '033円[1000000#P' # ~1 GB allocation, multi-second hang

XTPUSHCOLORS takes a "slot" parameter and grows the color stack to
that size. vt_param_get returns up to 0x7fffffff, and the handler has
no clamp. Each slot is sizeof(struct colors) = 1056 bytes (256-entry
color table plus fg/bg/cursor/selection), so slot N costs N*1056 bytes
of allocation plus an N-iteration memcpy loop on the main event
thread.

csi.c case 'P' under private '#':

int slot = vt_param_get(term, 0, 0);
...
if (term->color_stack.size < slot) {
 const size_t new_size = slot;
 term->color_stack.stack = xrealloc(
 term->color_stack.stack,
 new_size * sizeof(term->color_stack.stack[0]));
 ...
 for (size_t i = term->color_stack.size; i < new_size - 1; i++)
 memcpy(&term->color_stack.stack[i], &term->colors,
 sizeof(term->colors));
}

Same delivery model as the CHT/CBT issue.

xterm restricts this parameter to 1-10 per spec. foot has no bound.

Fix: cap slot to a small constant.

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 A program that writes to the terminal can crash foot or force a multi- GB allocation with a single ~16-byte escape sequence: printf '033円[2147483647#P' # aborts foot (xrealloc fails) printf '033円[1000000#P' # ~1 GB allocation, multi-second hang XTPUSHCOLORS takes a "slot" parameter and grows the color stack to that size. vt_param_get returns up to 0x7fffffff, and the handler has no clamp. Each slot is sizeof(struct colors) = 1056 bytes (256-entry color table plus fg/bg/cursor/selection), so slot N costs N*1056 bytes of allocation plus an N-iteration memcpy loop on the main event thread. csi.c case 'P' under private '#': int slot = vt_param_get(term, 0, 0); ... if (term->color_stack.size < slot) { const size_t new_size = slot; term->color_stack.stack = xrealloc( term->color_stack.stack, new_size * sizeof(term->color_stack.stack[0])); ... for (size_t i = term->color_stack.size; i < new_size - 1; i++) memcpy(&term->color_stack.stack[i], &term->colors, sizeof(term->colors)); } Same delivery model as the CHT/CBT issue. xterm restricts this parameter to 1-10 per spec. foot has no bound. Fix: cap slot to a small constant. ### 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#2362
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?