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