Skip to content

Commit

Permalink
Stop using comma from command substitution in brace expansion
Browse files Browse the repository at this point in the history
Fixes #5048
  • Loading branch information
krobelus committed Apr 26, 2024
1 parent ec33550 commit fb99eda
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 4 deletions.
10 changes: 10 additions & 0 deletions src/common.rs
Expand Up @@ -122,6 +122,8 @@ bitflags! {
const SYMBOLIC = 1 << 3;
/// Escape : and =
const SEPARATORS = 1 << 4;
/// Escape ,
const COMMA = 1 << 5;
}
}

Expand Down Expand Up @@ -183,6 +185,7 @@ pub fn escape_string(s: &wstr, style: EscapeStringStyle) -> WString {
fn escape_string_script(input: &wstr, flags: EscapeFlags) -> WString {
let escape_printables = !flags.contains(EscapeFlags::NO_PRINTABLES);
let escape_separators = flags.contains(EscapeFlags::SEPARATORS);
let escape_comma = flags.contains(EscapeFlags::COMMA);
let no_quoted = flags.contains(EscapeFlags::NO_QUOTED);
let no_tilde = flags.contains(EscapeFlags::NO_TILDE);
let no_qmark = feature_test(FeatureFlag::qmark_noglob);
Expand Down Expand Up @@ -300,6 +303,13 @@ fn escape_string_script(input: &wstr, flags: EscapeFlags) -> WString {
}
out.push(c);
}
',' => {
if escape_comma {
need_escape = true;
out.push('\\');
}
out.push(c);
}

'&' | '$' | ' ' | '#' | '<' | '>' | '(' | ')' | '[' | ']' | '{' | '}' | '?' | '*'
| '|' | ';' | '"' | '%' | '~' => {
Expand Down
8 changes: 4 additions & 4 deletions src/expand.rs
Expand Up @@ -8,9 +8,9 @@ use crate::builtins::shared::{
STATUS_INVALID_ARGS, STATUS_NOT_EXECUTABLE, STATUS_READ_TOO_MUCH, STATUS_UNMATCHED_WILDCARD,
};
use crate::common::{
char_offset, charptr2wcstring, escape, escape_string_for_double_quotes, unescape_string,
valid_var_name_char, wcs2zstring, UnescapeFlags, UnescapeStringStyle, EXPAND_RESERVED_BASE,
EXPAND_RESERVED_END,
char_offset, charptr2wcstring, escape, escape_string, escape_string_for_double_quotes,
unescape_string, valid_var_name_char, wcs2zstring, EscapeFlags, EscapeStringStyle,
UnescapeFlags, UnescapeStringStyle, EXPAND_RESERVED_BASE, EXPAND_RESERVED_END,
};
use crate::complete::{CompleteFlags, Completion, CompletionList, CompletionReceiver};
use crate::env::{EnvVar, Environment};
Expand Down Expand Up @@ -1096,7 +1096,7 @@ pub fn expand_cmdsubst(
}

for sub_item in sub_res {
let sub_item2 = escape(&sub_item);
let sub_item2 = escape_string(&sub_item, EscapeStringStyle::Script(EscapeFlags::COMMA));
for tail_item in &*tail_expand {
let mut whole_item = WString::new();
whole_item.reserve(paren_begin + 1 + sub_item2.len() + 1 + tail_item.completion.len());
Expand Down
3 changes: 3 additions & 0 deletions tests/checks/braces.fish
Expand Up @@ -48,3 +48,6 @@ world}
end
#CHECK: '{hello
#CHECK: world}'

echo {a(echo ,)b}
#CHECK: {a,b}

0 comments on commit fb99eda

Please sign in to comment.