gsu subcommand: Fix off-by-one bug in gsu_cword_is_option_parameter().
authorAndre Noll <maan@systemlinux.org>
Tue, 29 Nov 2011 22:26:48 +0000 (23:26 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 29 Aug 2014 19:39:58 +0000 (21:39 +0200)
We define $n as the number of characters in the getopt string *minus one*,
so we must loop from 0 to $n, inclusively.

This patch also adds documentation of this public function.

misc/gsu/subcommand

index 7ba4850..84c0174 100644 (file)
@@ -434,6 +434,15 @@ EOF
        ret=$GSU_SUCCESS
 }
 
+# Find out if the current word is a parameter for an option.
+#
+# $1:   usual getopts option string.
+# $2:   The current word number.
+# $3..: All words of the current command line.
+#
+# return: If yes, $result contains the letter of the option for which the
+# current word is a parameter. Otherwise, $result is empty.
+#
 gsu_cword_is_option_parameter()
 {
        local opts="$1" cword="$2" prev i n
@@ -449,7 +458,7 @@ gsu_cword_is_option_parameter()
        [[ ! "$prev" == -* ]] && return
 
        n=$((${#opts} - 1))
-       for ((i=0; i < $n; i++)); do
+       for ((i=0; i <= $n; i++)); do
                opt="${opts:$i:1}"
                [[ "${opts:$(($i + 1)):1}" != ":" ]] && continue
                let i++