commit:     3b27d1cd00f549724f5a2da0d97099e37aef6043
Author:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
AuthorDate: Mon Oct  7 21:01:56 2019 +0000
Commit:     Thomas Deutschmann <whissi <AT> gentoo <DOT> org>
CommitDate: Mon Oct  7 21:44:50 2019 +0000
URL:        https://gitweb.gentoo.org/proj/genkernel.git/commit/?id=3b27d1cd

linuxrc: Check that init value is actually a file

Just checking that init value is exectuable won't catch errors
where user provided a directory instead of a file.

Signed-off-by: Thomas Deutschmann <whissi <AT> gentoo.org>

 defaults/linuxrc | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/defaults/linuxrc b/defaults/linuxrc
index c0d4c0d..852992d 100644
--- a/defaults/linuxrc
+++ b/defaults/linuxrc
@@ -862,27 +862,30 @@ do
                # else not a good root and start over.
                if [ "${mountret}" = '0' ]
                then
-                       if [ -x "${NEW_ROOT}${REAL_INIT:-/sbin/init}" ]
+                       init_binary_file="${NEW_ROOT}${REAL_INIT:-/sbin/init}"
+                       init_binary_fallback_file="${NEW_ROOT}/bin/sh"
+
+                       if [ -f "${init_binary_file}" -a -x 
"${init_binary_file}" ]
                        then
                                break
                        else
-                               warn_msg "${NEW_ROOT}${REAL_INIT:-/sbin/init} 
was not found or is not executable, maybe a symlink?" ${QUIET}
+                               warn_msg "'${init_binary_file}' was not found, 
is not a file or is not executable, maybe a symlink?" ${QUIET}
                        fi
 
-                       if [ -L "${NEW_ROOT}${REAL_INIT:-/sbin/init}" ]
+                       if [ -L "${init_binary_file}" ]
                        then
                                good_msg "Symlink detected! Assuming split /usr 
..." ${QUIET}
                                break
                        else
-                               warn_msg "${NEW_ROOT}${REAL_INIT:-/sbin/init} 
is not a symlink, do we have at least /bin/sh?" ${QUIET}
+                               warn_msg "'${init_binary_file}' is not a 
symlink, do we have at least /bin/sh?" ${QUIET}
                        fi
 
-                       if [ -x "${NEW_ROOT}/bin/sh" ]
+                       if [ -f "${init_binary_fallback_file}" -a -x 
"${init_binary_fallback_file}" ]
                        then
-                               good_msg "Executable ${NEW_ROOT}/bin/sh 
detected!" ${QUIET}
+                               good_msg "Executable fallback file 
'${init_binary_fallback_file}' detected!" ${QUIET}
                                break
                        else
-                               warn_msg "${NEW_ROOT}/bin/sh was not found or 
is not executable, maybe we are working with NFS?" ${QUIET}
+                               warn_msg "'${init_binary_fallback_file}' was 
not found, is not a file or is not executable, maybe we are working with NFS?" 
${QUIET}
                        fi
 
                        if [ "${REAL_ROOT}" = "/dev/nfs" ]
@@ -893,7 +896,9 @@ do
                                warn_msg "No NFS detected!" ${QUIET}
                        fi
 
-                       bad_msg "The filesystem mounted at ${REAL_ROOT} does 
not appear to be a valid /!"
+                       bad_msg "The filesystem mounted at ${REAL_ROOT} does 
not appear to be a valid /:"
+                       bad_msg "Neither executable file '${init_binary_file}' 
nor '${init_binary_fallback_file}' was found."
+                       bad_msg "If correct root device was specified, check 
'root' or 'init' kernel command-line parameter!"
                        got_good_root=0
                else
                        bad_msg "Could not mount specified ROOT!"
@@ -1297,7 +1302,7 @@ init=${REAL_INIT:-/sbin/init}
 if ! mountpoint "${CHROOT}" 1>/dev/null 2>&1
 then
        bad_msg "${CHROOT} was not a mountpoint"
-elif chroot "${CHROOT}" /usr/bin/test ! -x /${init}
+elif chroot "${CHROOT}" /usr/bin/test ! -x /${init#/}
 then
        bad_msg "init=${init} does not exist in the rootfs!"
 elif [ $$ != 1 ]

Reply via email to