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

DnD text/uri-list path is single-quoted without escaping internal quotes #2363

Closed
opened 2026年05月24日 23:26:16 +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

selection.c decode_one_uri (line ~2073):

if (streq(scheme, "file") && hostname_is_localhost(host)) {
 if (ctx->quote_paths)
 ctx->cb("'", 1, ctx->user);
 ctx->cb(path, strlen(path), ctx->user);
 if (ctx->quote_paths)
 ctx->cb("'", 1, ctx->user);
} else
 ctx->cb(uri, len, ctx->user);

quote_paths is true when term->grid == &term->normal, so the path
is wrapped in single quotes when dropped on the normal grid (typical
shell prompt). The path itself is whatever uri_parse() returns after
%xx-decoding the input URI; single quotes inside the path are not
escaped, doubled, or rejected, so they terminate the surrounding
single-quoted region.

Reproduce:

# Create a file whose name contains a single quote and a shell
# metacharacter sequence.
touch "/tmp/foo';id #.txt"
# Drag this file from a file manager onto a foot window running
# a shell.

The file manager hands foot the URI
file:///tmp/foo%27%3Bid%20%23.txt. uri_parse decodes the path to
/tmp/foo';id #.txt. decode_one_uri concatenates ', the path, and
', producing this byte stream to the slave:

'/tmp/foo';id #.txt'

A POSIX shell parses that as: argument /tmp/foo, command separator
;, command id, comment #.txt'. Pressing Enter (or, on shells
without bracketed paste, immediately) runs id.

Bracketed paste reduces this to "user must press Enter once", but
does not prevent execution if the user accepts the paste.

Fix: in decode_one_uri, escape single quotes inside path before
emitting (POSIX form: replace each ' with '\''), or refuse paths
containing characters that would break shell quoting. Same treatment
is needed for the non-localhost branch that emits the raw URI: a
file: URI containing a single quote is rejected upstream by
uri_parse, but non-file: URIs with single quotes in the path or
authority would also break.
(END)

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 selection.c decode_one_uri (line ~2073): if (streq(scheme, "file") && hostname_is_localhost(host)) { if (ctx->quote_paths) ctx->cb("'", 1, ctx->user); ctx->cb(path, strlen(path), ctx->user); if (ctx->quote_paths) ctx->cb("'", 1, ctx->user); } else ctx->cb(uri, len, ctx->user); `quote_paths` is true when `term->grid == &term->normal`, so the path is wrapped in single quotes when dropped on the normal grid (typical shell prompt). The path itself is whatever uri_parse() returns after %xx-decoding the input URI; single quotes inside the path are not escaped, doubled, or rejected, so they terminate the surrounding single-quoted region. Reproduce: # Create a file whose name contains a single quote and a shell # metacharacter sequence. touch "/tmp/foo';id #.txt" # Drag this file from a file manager onto a foot window running # a shell. The file manager hands foot the URI `file:///tmp/foo%27%3Bid%20%23.txt`. uri_parse decodes the path to `/tmp/foo';id #.txt`. decode_one_uri concatenates `'`, the path, and `'`, producing this byte stream to the slave: '/tmp/foo';id #.txt' A POSIX shell parses that as: argument `/tmp/foo`, command separator `;`, command `id`, comment `#.txt'`. Pressing Enter (or, on shells without bracketed paste, immediately) runs `id`. Bracketed paste reduces this to "user must press Enter once", but does not prevent execution if the user accepts the paste. Fix: in decode_one_uri, escape single quotes inside `path` before emitting (POSIX form: replace each `'` with `'\''`), or refuse paths containing characters that would break shell quoting. Same treatment is needed for the non-localhost branch that emits the raw URI: a file: URI containing a single quote is rejected upstream by uri_parse, but non-`file:` URIs with single quotes in the path or authority would also break. (END) ### 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#2363
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?