Ensure that proper number of parameters is passed to each versionator
function; die otherwise. This prevents the functions from proceeding
with undefined behavior when mis-called. However, it does not cover the
most common mistake of passing an empty version that implicitly gets
replaced by ${PV}.
---
 eclass/versionator.eclass | 39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/eclass/versionator.eclass b/eclass/versionator.eclass
index 74e676ee..e42fc4d 100644
--- a/eclass/versionator.eclass
+++ b/eclass/versionator.eclass
@@ -1,4 +1,4 @@
-# Copyright 1999-2014 Gentoo Foundation
+# Copyright 1999-2016 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
@@ -46,6 +46,8 @@ get_all_version_components() {
        local ver_str=${1:-${PV}} result
        result=()
 
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        # sneaky cache trick cache to avoid having to parse the same thing 
several
        # times.
        if [[ ${VERSIONATOR_CACHE_VER_STR} == ${ver_str} ]] ; then
@@ -101,6 +103,8 @@ get_all_version_components() {
 #     20040905    ->  20040905
 #     3.0c-r1     ->  3 0 c r1
 get_version_components() {
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        local c=$(get_all_version_components "${1:-${PV}}")
        echo ${c//[-._]/ }
 }
@@ -115,6 +119,8 @@ get_version_components() {
 #     20040905    ->  20040905
 #     3.0c-r1     ->  3
 get_major_version() {
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        local c=($(get_all_version_components "${1:-${PV}}"))
        echo ${c[0]}
 }
@@ -128,6 +134,9 @@ get_major_version() {
 #    1-2    1.2.3       -> 1.2
 #    2-     1.2.3       -> 2.3
 get_version_component_range() {
+       [[ $# -ge 1 ]] || die "${FUNCNAME}: no range provided"
+       [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        eshopts_push -s extglob
        local c v="${2:-${PV}}" range="${1}" range_start range_end
        local -i i=-1 j=0
@@ -161,6 +170,8 @@ get_version_component_range() {
 #     20040905    ->  (empty string)
 #     3.0c-r1     ->  0c-r1
 get_after_major_version() {
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        echo $(get_version_component_range 2- "${1:-${PV}}")
 }
 
@@ -175,6 +186,9 @@ get_after_major_version() {
 # Rather than being a number, $1 can be a separator character such as '-', '.'
 # or '_'. In this case, the first separator of this kind is selected.
 replace_version_separator() {
+       [[ $# -ge 2 ]] || die "${FUNCNAME}: required parameters missing"
+       [[ $# -le 3 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        eshopts_push -s extglob
        local w c v="${3:-${PV}}"
        declare -i i found=0
@@ -210,6 +224,9 @@ replace_version_separator() {
 # Replace all version separators in $2 (defaults to $PV) with $1.
 #     '_' 1b.2.3        -> 1b_2_3
 replace_all_version_separators() {
+       [[ $# -ge 1 ]] || die "${FUNCNAME}: no replacement provided"
+       [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        local c=($(get_all_version_components "${2:-${PV}}"))
        c=${c[@]//[-._]/$1}
        echo ${c// }
@@ -226,6 +243,9 @@ replace_all_version_separators() {
 # Rather than being a number, $1 can be a separator character such as '-', '.'
 # or '_'. In this case, the first separator of this kind is deleted.
 delete_version_separator() {
+       [[ $# -ge 1 ]] || die "${FUNCNAME}: no index provided"
+       [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        replace_version_separator "${1}" "" "${2}"
 }
 
@@ -235,6 +255,8 @@ delete_version_separator() {
 # Delete all version separators in $1 (defaults to $PV).
 #     1b.2.3        -> 1b23
 delete_all_version_separators() {
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        replace_all_version_separators "" "${1}"
 }
 
@@ -245,6 +267,8 @@ delete_all_version_separators() {
 #     1.0.1       ->  3
 #     3.0c-r1     ->  4
 get_version_component_count() {
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        local a=($(get_version_components "${1:-${PV}}"))
        echo ${#a[@]}
 }
@@ -257,6 +281,8 @@ get_version_component_count() {
 #     1.0.1       ->  2
 #     3.0c-r1     ->  3
 get_last_version_component_index() {
+       [[ $# -le 1 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        echo $(($(get_version_component_count "${1:-${PV}}" ) - 1))
 }
 
@@ -267,6 +293,9 @@ get_last_version_component_index() {
 # only. May not be reliable, be sure to do very careful testing before actually
 # using this.
 version_is_at_least() {
+       [[ $# -ge 1 ]] || die "${FUNCNAME}: wanted version not provided"
+       [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        local want_s="$1" have_s="${2:-${PVR}}" r
        version_compare "${want_s}" "${have_s}"
        r=$?
@@ -291,6 +320,9 @@ version_is_at_least() {
 # return 3. You probably want version_is_at_least rather than this function.
 # May not be very reliable. Test carefully before using this.
 version_compare() {
+       [[ $# -ge 2 ]] || die "${FUNCNAME}: versions not provided"
+       [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        eshopts_push -s extglob
        local ver_a=${1} ver_b=${2} parts_a parts_b
        local cur_tok_a cur_tok_b num_part_a num_part_b
@@ -468,6 +500,8 @@ version_compare() {
 # algorithm for simplicity, so don't call it with more than a few dozen items.
 # Uses version_compare, so be careful.
 version_sort() {
+       [[ $# -ge 1 ]] || die "${FUNCNAME}: version not provided"
+
        eshopts_push -s extglob
        local items=
        local -i left=0
@@ -501,6 +535,9 @@ version_sort() {
 # MY_P=$(version_format_string '${PN}_source_$1_$2-$3_$4')
 # Now MY_P will be: cow-hat_source_1_2-3_p4
 version_format_string() {
+       [[ $# -ge 1 ]] || die "${FUNCNAME}: no format provided"
+       [[ $# -le 2 ]] || die "${FUNCNAME}: too many parameters ($#)"
+
        local fstr=$1
        shift
        set -- $(get_version_components "$@")
-- 
2.9.2


Reply via email to