commit:     5fd090827d2f4464245bbd454371c040358d6b1d
Author:     Ulrich Müller <ulm <AT> gentoo <DOT> org>
AuthorDate: Sat May  6 13:04:58 2017 +0000
Commit:     Ulrich Müller <ulm <AT> gentoo <DOT> org>
CommitDate: Sat May  6 13:04:58 2017 +0000
URL:        https://gitweb.gentoo.org/proj/eselect.git/commit/?id=5fd09082

Improved error checking in kernel module.

* modules/kernel.eselect (do_set): Don't remove the old symlink
before we know that we have a valid new target. Simplify.
(set_symlink): Check if the new link target is valid, then remove
any old symlink, then set the new one.
(remove_symlink): Use rm -f.

 ChangeLog              |  6 ++++++
 modules/kernel.eselect | 32 ++++++++++++++++----------------
 2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2b356bd..6deef3a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2017-05-06  Ulrich Müller  <[email protected]>
 
+       * modules/kernel.eselect (do_set): Don't remove the old symlink
+       before we know that we have a valid new target. Simplify.
+       (set_symlink): Check if the new link target is valid, then remove
+       any old symlink, then set the new one.
+       (remove_symlink): Use rm -f.
+
        * modules/kernel.eselect (set_symlink):
        * modules/profile.eselect (set_symlink): Check range of number,
        bug 617572. Thanks to Takuto Yoshida <[email protected]>.

diff --git a/modules/kernel.eselect b/modules/kernel.eselect
index e76c143..57b9b7e 100644
--- a/modules/kernel.eselect
+++ b/modules/kernel.eselect
@@ -35,7 +35,7 @@ find_targets() {
 
 # remove the kernel symlink
 remove_symlink() {
-       rm "${EROOT}/usr/src/linux"
+       rm -f "${EROOT}/usr/src/linux"
 }
 
 # set the kernel symlink
@@ -49,15 +49,19 @@ set_symlink() {
                target=${targets[target-1]}
        fi
 
-       if [[ -z ${target} ]]; then
-               die -q "Target \"$1\" doesn't appear to be valid!"
-       elif [[ -f ${EROOT}/usr/src/${target}/Makefile ]]; then
-               ln -s "${target}" "${EROOT}/usr/src/linux"
-       elif [[ -f ${EROOT}/usr/src/linux-${target}/Makefile ]]; then
-               ln -s "linux-${target}" "${EROOT}/usr/src/linux"
-       else
-               die -q "Target \"$1\" doesn't appear to be valid!"
+       if [[ -n ${target} ]]; then
+               if [[ -f ${EROOT}/usr/src/${target}/Makefile ]]; then
+                       :
+               elif [[ -f ${EROOT}/usr/src/linux-${target}/Makefile ]]; then
+                       target=linux-${target}
+               else                                    # target not valid
+                       target=
+               fi
        fi
+       [[ -n ${target} ]] || die -q "Target \"$1\" doesn't appear to be valid!"
+
+       remove_symlink || die -q "Couldn't remove existing symlink"
+       ln -s "${target}" "${EROOT}/usr/src/linux"
 }
 
 ### show action ###
@@ -114,14 +118,10 @@ do_set() {
        [[ -z $1 ]] && die -q "You didn't tell me what to set the symlink to"
        [[ $# -gt 1 ]] && die -q "Too many parameters"
 
-       if [[ -L ${EROOT}/usr/src/linux ]]; then
-               # existing symlink
-               remove_symlink || die -q "Couldn't remove existing symlink"
-               set_symlink "$1" || die -q "Couldn't set a new symlink"
-       elif [[ -e ${EROOT}/usr/src/linux ]]; then
+       if [[ -e ${EROOT}/usr/src/linux && ! -L ${EROOT}/usr/src/linux ]]; then
                # we have something strange
                die -q "${EROOT}/usr/src/linux exists but is not a symlink"
-       else
-               set_symlink "$1" || die -q "Couldn't set a new symlink"
        fi
+
+       set_symlink "$1" || die -q "Couldn't set a new symlink"
 }

Reply via email to