Use trim_path when we compare paths.
[live-boot-grml.git] / scripts / live-helpers
index 88a3861..795de55 100644 (file)
@@ -1126,22 +1126,21 @@ link_files ()
 
        # This check can only trigger on the inital, non-recursive call since
        # we create the destination before recursive calls
-       if [ ! -d "${dest_dir}" ];
+       if [ ! -d "${dest_dir}" ]
        then
                log_warning_msg "Must link_files into a directory"
                return
        fi
 
-       find "${src_dir}" -mindepth 1 -maxdepth 1 | while read x; do
-               local src="${x}"
-               local dest="${dest_dir}$(basename "${x}")"
-               if [ -d "${src}" ];
+       find "${src_dir}" -mindepth 1 -maxdepth 1 | while read src; do
+               local dest="${dest_dir}$(basename "${src}")"
+               if [ -d "${src}" ]
                then
-                       if [ -z "$(ls -A "${src}")" ];
+                       if [ -z "$(ls -A "${src}")" ]
                        then
                                continue
                        fi
-                       if [ ! -d "${dest}" ];
+                       if [ ! -d "${dest}" ]
                        then
                                mkdir -p "${dest}"
                                prev="$(dirname "${dest}")"
@@ -1228,10 +1227,9 @@ get_custom_mounts ()
 
        local devices="${1}"
        local custom_mounts="${2}" # print result to this file
-       local rootmnt="${3}"       # should be set empty post-live-boot
 
-       local bindings="/bindings.list"
-       local links="/links.list"
+       local bindings="/tmp/bindings.list"
+       local links="/tmp/links.list"
        rm -rf ${bindings} ${links} 2> /dev/null
 
        for device in ${devices}
@@ -1283,10 +1281,15 @@ get_custom_mounts ()
                                dest="${source}"
                        fi
 
-                       if echo ${dest} | grep -qe "^/\+$\|^/\+live\(/.*\)\?$"
+                       if trim_path ${source} | grep -qe "^\(.*/\)\?\.\.\?\(/.*\)\?$"
                        then
-                               # mounting on / or /live could cause trouble
-                               log_warning_msg "Skipping unsafe custom mount on ${dest}"
+                               log_warning_msg "Skipping unsafe custom mount with source ${source}: the source is a relative or absolute path w.r.t. the persistent media root and cannot use \".\" or \"..\""
+                               continue
+                       fi
+
+                       if trim_path ${dest} | grep -q -e "^/$" -e "^/live\(/.*\)\?$" -e "^/\(.*/\)\?\.\.\?\(/.*\)\?$"
+                       then
+                               log_warning_msg "Skipping unsafe custom mount with desination ${dest}: the destination must be an absolute path using neither \".\" nor \"..\", and cannot be /live (or any sub-directory therein) or / (for the latter, use ${root_overlay_label}-type persistence instead)"
                                continue
                        fi
 
@@ -1302,18 +1305,9 @@ get_custom_mounts ()
                                esac
                        done
 
-                       # FIXME: handle case: we already have /a/b in
-                       # $bindings added from current $device, but
-                       # now we find /a -- /a should replace /a/b in
-                       # $bindings.
-
-                       # FIXME: handle case: we have /a in $bindings
-                       # from current $device, now we find /a/b, so
-                       # we skip /a/b
-
                        # ensure that no multiple-/ occur in paths
-                       local full_source="$(echo ${backing}/${source}/ | sed -e 's|/\+|/|g')"
-                       local full_dest="$(echo ${rootmnt}/${dest}/ | sed -e 's|/\+|/|g')"
+                       local full_source="$(trim_path ${backing}/${source})"
+                       local full_dest="$(trim_path ${rootmnt}/${dest})"
                        device_used="yes"
                        if echo ${options} | grep -qe "\<linkfiles\>";
                        then
@@ -1345,7 +1339,6 @@ get_custom_mounts ()
 do_custom_mounts ()
 {
        local custom_mounts="${1}" # the ouput from get_custom_mounts()
-       local rootmnt="${2}"       # should be set empty post-live-boot
 
        while read source dest options # < ${custom_mounts}
        do
@@ -1380,7 +1373,7 @@ do_custom_mounts ()
                        # FIXME: this should really be handled by
                        # live-config since we don't know for sure
                        # which uid a certain user has until then
-                       if echo ${dest} | grep -qe "^${rootmnt}/*home/\+[^/]\+"
+                       if trim_path ${dest} | grep -qe "^${rootmnt}/*home/[^/]\+"
                        then
                                path="/"
                                for dir in $(echo ${dest} | sed -e 's|/\+| |g')
@@ -1426,7 +1419,6 @@ do_custom_mounts ()
                                rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")"
                        else
                                rofs_dest_backing="${d}/${dest}"
-
                        fi
                        if [ -d "${rofs_dest_backing}" ]
                        then
@@ -1494,6 +1486,6 @@ fix_home_rw_compatibility ()
        if [ ! -r "${include_list}" ]
        then
                echo "# home-rw backwards compatibility:
-. /home" > "${include_list}"
+/ /home" > "${include_list}"
        fi
 }