posix_realpath: make sure we don't loop infinitely

On broken symlink loops this would never terminate. The most
naive and easy solution is a max of loop steps.
This commit is contained in:
Julian Ospald 2019-04-18 11:36:59 +08:00
parent 09abd528ee
commit 6e1ee078cc
No known key found for this signature in database
GPG Key ID: 511B62C09D50CD28

10
ghcup
View File

@ -1131,12 +1131,20 @@ get_distro_alias() {
# @STDOUT: realpath of the given file # @STDOUT: realpath of the given file
posix_realpath() { posix_realpath() {
[ -z "$1" ] && die "Internal error: no argument given to posix_realpath" [ -z "$1" ] && die "Internal error: no argument given to posix_realpath"
current_loop=0
max_loops=50
mysource=$1 mysource=$1
while [ -h "${mysource}" ]; do while [ -h "${mysource}" ]; do
current_loop=$((current_loop+1))
mydir="$( cd -P "$( dirname "${mysource}" )" > /dev/null 2>&1 && pwd )" mydir="$( cd -P "$( dirname "${mysource}" )" > /dev/null 2>&1 && pwd )"
mysource="$(readlink "${mysource}")" mysource="$(readlink "${mysource}")"
[ "${mysource%${mysource#?}}"x != '/x' ] && mysource="${mydir}/${mysource}" [ "${mysource%${mysource#?}}"x != '/x' ] && mysource="${mydir}/${mysource}"
if [ ${current_loop} -gt ${max_loops} ] ; then
(>&2 echo "${1}: Too many levels of symbolic links")
break
fi
done done
mydir="$( cd -P "$( dirname "${mysource}" )" > /dev/null 2>&1 && pwd )" mydir="$( cd -P "$( dirname "${mysource}" )" > /dev/null 2>&1 && pwd )"
@ -1149,7 +1157,7 @@ posix_realpath() {
echo "${mydir%/}/$(basename "${mysource}")" echo "${mydir%/}/$(basename "${mysource}")"
fi fi
unset mysource mydir posix_realpath_error unset current_loop max_loops mysource mydir
} }