aboutsummaryrefslogtreecommitdiffstats
path: root/bash-completion
diff options
context:
space:
mode:
authorThomas Weißschuh <thomas@t-8ch.de>2022-12-27 02:59:26 +0000
committerThomas Weißschuh <thomas@t-8ch.de>2022-12-27 03:22:23 +0000
commitd883f868a839f9d437688ad9c3ad05d78affb6ef (patch)
treeae15044316a76c7fcd45e43e363a72352acdcce0 /bash-completion
parent0dfba752af78c59252f6de49cd9a97f8e05cf1cf (diff)
downloadutil-linux-d883f868a839f9d437688ad9c3ad05d78affb6ef.tar.gz
umount: properly handle special characters in completion
Fixes #1834
Diffstat (limited to 'bash-completion')
-rw-r--r--bash-completion/umount20
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 " "