You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On Unix, the Debug impl for Command prints the command using quotes around each argument, e.g.
"ls" "-la" "\"foo \""
The use of spaces as a delimiter suggests that the output is suitable to be passed to a shell. While it's debatable whether users should be depending on any specific debug representation, in practice, at least rustc itself uses it for user-facing output (when passing -Z print-link-args).
There are two problems with this:
It's insecure! The quoting is performed, via the Debug impl for CStr, by ascii::escape_default, whose escaping rules are
chosen with a bias toward producing literals that are legal in a variety of languages, including C++11 and similar C-family languages.
However, this does not include escaping the characters $, `, and !, which have a special meaning within double quotes in Unix shell syntax. So, for example:
but if you run that in a shell, it won't produce the same behavior as the original command.
It's noisy. In a long command line like those produced by -Z print-link-args, most arguments don't contain any characters that need to be quoted or escaped, and the output is long enough without unnecessary quotes.
Cargo uses the shell-escape crate for this purpose; perhaps that code can be copied into libstd.
The text was updated successfully, but these errors were encountered:
Enselic
added
T-libs
Relevant to the library team, which will review and decide on the PR/issue.
and removed
T-libs-api
Relevant to the library API team, which will review and decide on the PR/issue.
labels
Nov 24, 2023
On Unix, the Debug impl for Command prints the command using quotes around each argument, e.g.
The use of spaces as a delimiter suggests that the output is suitable to be passed to a shell. While it's debatable whether users should be depending on any specific debug representation, in practice, at least rustc itself uses it for user-facing output (when passing
-Z print-link-args
).There are two problems with this:
It's insecure! The quoting is performed, via the
Debug
impl forCStr
, byascii::escape_default
, whose escaping rules areHowever, this does not include escaping the characters $, `, and !, which have a special meaning within double quotes in Unix shell syntax. So, for example:
prints
but if you run that in a shell, it won't produce the same behavior as the original command.
It's noisy. In a long command line like those produced by
-Z print-link-args
, most arguments don't contain any characters that need to be quoted or escaped, and the output is long enough without unnecessary quotes.Cargo uses the
shell-escape
crate for this purpose; perhaps that code can be copied into libstd.The text was updated successfully, but these errors were encountered: