Skip to content

Commit 452fde3

Browse files
authored
Merge pull request #4126 from canonical/bash-completion-improvements
Harden bash completion security a little
2 parents 569db07 + 700d9a2 commit 452fde3

1 file changed

Lines changed: 25 additions & 25 deletions

File tree

completions/bash/multipass

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,28 @@
1212
# You should have received a copy of the GNU General Public License
1313
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1414

15+
set -o pipefail
16+
1517
_multipass_complete()
1618
{
1719
_multipass_instances()
1820
{
19-
local state=$1
20-
21-
local cmd="multipass list --format=csv --no-ipv4 | \tail -n +2"
22-
[ -n "$state" ] && cmd="$cmd | \awk -F',' '\$2 == \"$state\"'"
21+
local state=$1 instances
2322

24-
local instances=$( \eval $cmd | \cut -d',' -f 1 | \tr '\r\n' ' ')
23+
instances=$(multipass list --format=csv --no-ipv4 | \tail -n +2)
24+
[ -n "$state" ] && instances=$(awk -F',' "\$2 == \"$state\"" <<< "$instances")
25+
instances=$(echo "$instances" | \cut -d',' -f 1 | \tr '\r\n' ' ')
2526

2627
_add_nonrepeating_args "$instances"
2728
}
2829

2930
_multipass_snapshots()
3031
{
31-
local instance=$1
32-
local cmd="multipass list --snapshots --format=csv 2>/dev/null | \tail -n +2"
33-
[ -n "$instance" ] && cmd="$cmd | \awk -F',' '\$1 == \"$instance\"'"
34-
local snapshots=$( \eval $cmd | \cut -d',' -f 1,2 | \tr ',' '.' | \tr '\r\n' ' ' )
32+
local instance=$1 snapshots
33+
34+
snapshots=$(multipass list --snapshots --format=csv 2>/dev/null | \tail -n +2)
35+
[ -n "$instance" ] && snapshots=$(awk -F',' "\$1 == \"$instance\"" <<< "$snapshots")
36+
snapshots=$(echo "$snapshots" | \cut -d',' -f 1,2 | \tr ',' '.' | \tr '\r\n' ' ')
3537

3638
_add_nonrepeating_args "$snapshots"
3739
}
@@ -44,11 +46,12 @@ _multipass_complete()
4446

4547
_multipass_restorable_snapshots()
4648
{
47-
local instances=$( multipass info --no-runtime-information --format=csv \
48-
| \tail -n +2 \
49-
| \awk -F',|\r?\n' '$2 == "Stopped" && $16 > 0' \
50-
| \cut -d',' -f 1 \
51-
| \tr '\r\n' ' ')
49+
local instances
50+
instances=$( multipass info --no-runtime-information --format=csv \
51+
| \tail -n +2 \
52+
| \awk -F',|\r?\n' '$2 == "Stopped" && $16 > 0' \
53+
| \cut -d',' -f 1 \
54+
| \tr '\r\n' ' ')
5255

5356
for instance in ${instances}; do
5457
_multipass_snapshots "${instance}"
@@ -58,9 +61,7 @@ _multipass_complete()
5861
# Set $opts to the list of available networks.
5962
_multipass_networks()
6063
{
61-
local cmd="multipass networks --format=csv 2>/dev/null"
62-
63-
opts=$( \eval $cmd | \tail -n +2 | \cut -d',' -f 1 )
64+
opts=$( multipass networks --format=csv 2>/dev/null | \tail -n +2 | \cut -d',' -f 1 )
6465
}
6566

6667
_multipass_instances_with_colon()
@@ -79,8 +80,9 @@ _multipass_complete()
7980

8081
_multipass_settings_keys()
8182
{
82-
local cmd="multipass get --keys"
83-
local keys=$( \eval $cmd | \tr '\r\n' ' ' )
83+
local keys
84+
85+
keys=$( multipass get --keys | \tr '\r\n' ' ' )
8486

8587
for key in ${keys}; do
8688
if [[ "${COMP_WORDS[*]}" == *"${key}"* ]]; then
@@ -115,9 +117,7 @@ _multipass_complete()
115117
# Set $multipass_aliases to the list of available aliases.
116118
_multipass_aliases()
117119
{
118-
local cmd="multipass aliases --format=csv 2>/dev/null"
119-
120-
multipass_aliases=$( \eval $cmd | \tail -n +2 | \cut -d',' -f 1 )
120+
multipass_aliases=$( multipass aliases --format=csv 2>/dev/null | \tail -n +2 | \cut -d',' -f 1 )
121121
}
122122

123123
# Removes the comma or equals sign at the end of $cur.
@@ -198,7 +198,7 @@ _multipass_complete()
198198
for item in $array; do
199199
found=0
200200
for ((i=2; i<CWORD; i++)); do
201-
if [[ "${WORDS[i]}" == ${item} ]]; then
201+
if [[ "${WORDS[i]}" == "${item}" ]]; then
202202
found=1
203203
break
204204
fi
@@ -218,7 +218,7 @@ _multipass_complete()
218218
COMP_WORDBREAKS="${COMP_WORDBREAKS}="
219219
fi
220220

221-
local cur cmd opts prev prev2 prev_opts multipass_aliases unused_aliases
221+
local cur cmd opts prev prev2 prev_opts multipass_aliases
222222
_get_comp_words_by_ref -n := -w WORDS -i CWORD cur prev
223223
COMPREPLY=()
224224
cur="${COMP_WORDS[COMP_CWORD]}"
@@ -272,7 +272,7 @@ _multipass_complete()
272272
;;
273273
"unalias")
274274
_multipass_aliases
275-
_add_nonrepeating_args $multipass_aliases
275+
_add_nonrepeating_args "$multipass_aliases"
276276
;;
277277
"transfer"|"copy-files")
278278
_add_nonrepeating_args "--parents --recursive"

0 commit comments

Comments
 (0)