From: Thomas Weißschuh Date: Tue, 27 Dec 2022 02:59:26 +0000 (+0000) Subject: umount: properly handle special characters in completion X-Git-Tag: v2.39-rc1~351^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d883f868a839f9d437688ad9c3ad05d78affb6ef;p=thirdparty%2Futil-linux.git umount: properly handle special characters in completion Fixes #1834 --- 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 " "