diff options
| author | Thomas Weißschuh <thomas@t-8ch.de> | 2022-12-27 02:59:26 +0000 |
|---|---|---|
| committer | Thomas Weißschuh <thomas@t-8ch.de> | 2022-12-27 03:22:23 +0000 |
| commit | d883f868a839f9d437688ad9c3ad05d78affb6ef (patch) | |
| tree | ae15044316a76c7fcd45e43e363a72352acdcce0 /bash-completion | |
| parent | 0dfba752af78c59252f6de49cd9a97f8e05cf1cf (diff) | |
| download | util-linux-d883f868a839f9d437688ad9c3ad05d78affb6ef.tar.gz | |
umount: properly handle special characters in completion
Fixes #1834
Diffstat (limited to 'bash-completion')
| -rw-r--r-- | bash-completion/umount | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/bash-completion/umount b/bash-completion/umount index 2988c42f39..7650358ddd 100644 --- a/bash-completion/umount +++ b/bash-completion/umount @@ -3,16 +3,26 @@ _umount_points_list() # List of characters to escape shamelessly stolen from "scp" completion local escape_chars='[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]' - findmnt -lno TARGET | awk '{ - if ($0 ~ "^"ENVIRON["HOME"]) { + findmnt -lno TARGET | awk ' + + function literal_ere(s) { + gsub(/[][^$.*?+{}\\()|]/, "\\\\&", s) + return s + } + + { + home_ere = literal_ere(ENVIRON["HOME"]) + print home_ere + if ($0 ~ "^"home_ere) { homeless = $0 - sub("^"ENVIRON["HOME"], "~", homeless) + sub("^"home_ere, "~", homeless) gsub("'"$escape_chars"'", "\\\\&", homeless) print homeless " " } - if ($0 ~ "^"ENVIRON["PWD"]) { + pwd_ere = literal_ere(ENVIRON["PWD"]) + if ($0 ~ "^"pwd_ere) { reldir = $0 - sub("^"ENVIRON["PWD"]"/?", "", reldir) + sub("^"pwd_ere"/?", "", reldir) gsub("'"$escape_chars"'", "\\\\&", reldir) print "./" reldir " " print reldir " " |
