From d15a4009895b692ff2645e1e7041a7975c49e518 Mon Sep 17 00:00:00 2001 From: Tails developers Date: Mon, 26 Mar 2012 19:23:56 +0200 Subject: [PATCH 1/1] Make cases for all different custom mounting situations more explicit. The old code had grown wild over time and was hard to follow, and consequently contained bugs (all related to linkfiles custom mounts in read-only mode) that that became obvious and were fixed solely all thanks to this re-write. --- scripts/live-helpers | 97 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/scripts/live-helpers b/scripts/live-helpers index 78de240..889d157 100644 --- a/scripts/live-helpers +++ b/scripts/live-helpers @@ -1466,49 +1466,73 @@ activate_custom_mounts () # XXX: If CONFIG_AUFS_ROBR is added to the Debian kernel we can # ignore the loop below and set rofs_dest_backing=$dest - rofs_dest_backing="" - for d in ${rootmnt}/live/rofs/* - do - if [ -n "${rootmnt}" ] - then - rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")" - else - rofs_dest_backing="${d}/${dest}" - fi - if [ -d "${rofs_dest_backing}" ] - then - break - else - rofs_dest_backing="" - fi - done + local rofs_dest_backing="" + if [ -n "${opt_linkfiles}"] + then + for d in ${rootmnt}/live/rofs/* + do + if [ -n "${rootmnt}" ] + then + rofs_dest_backing="${d}/$(echo ${dest} | sed -e "s|${rootmnt}||")" + else + rofs_dest_backing="${d}/${dest}" + fi + if [ -d "${rofs_dest_backing}" ] + then + break + else + rofs_dest_backing="" + fi + done + fi - if [ -z "${PERSISTENT_READONLY}" ] + if [ -n "${opt_linkfiles}" ] && [ -z "${PERSISTENT_READONLY}" ] then - if [ -n "${opt_linkfiles}" ] - then - links_source="${source}" - links_dest="${dest}" - elif [ -n "${opt_union}" ] + link_files ${source} ${dest} ${rootmnt} + elif [ -n "${opt_linkfiles}" ] && [ -n "${PERSISTENT_READONLY}" ] + then + mkdir -p ${rootmnt}/live/persistent + local links_source=$(mktemp -d ${rootmnt}/live/persistent/links-source-XXXXXX) + chown_ref ${source} ${links_source} + chmod_ref ${source} ${links_source} + # We put the cow dir in the below strange place to + # make it absolutely certain that the link source + # has its own directory and isn't nested with some + # other custom mount (if so that mount's files would + # be linked, causing breakage. + if [ -n "${rootmnt}" ] then - do_union ${dest} ${source} ${rofs_dest_backing} + local cow_dir="/cow/live/persistent/$(basename ${links_source})" else - mount --bind "${source}" "${dest}" - fi - else - if [ -n "${opt_linkfiles}" ] - then - links_dest="${dest}" - dest="$(mktemp -d ${persistent_backing}/links_source-XXXXXX)" - links_source="${dest}" + # This is happens if persistence is activated + # post boot + local cow_dir="/live/cow/live/persistent/$(basename ${links_source})" fi + mkdir -p ${cow_dir} + chown_ref "${source}" "${cow_dir}" + chmod_ref "${source}" "${cow_dir}" + do_union ${links_source} ${cow_dir} ${source} ${rofs_dest_backing} + link_files ${links_source} ${dest} ${rootmnt} + elif [ -n "${opt_union}" ] && [ -z "${PERSISTENT_READONLY}" ] + then + do_union ${dest} ${source} ${rofs_dest_backing} + elif [ -n "${opt_bind}" ] && [ -z "${PERSISTENT_READONLY}" ] + then + mount --bind "${source}" "${dest}" + elif [ -n "${opt_bind}" -o -n "${opt_union}" ] && [ -n "${PERSISTENT_READONLY}" ] + then + # bind-mount and union mount are handled the same + # in read-only mode, but note that rofs_dest_backing + # is non-empty (and necessary) only for unions if [ -n "${rootmnt}" ] then - cow_dir="$(echo ${dest} | sed -e "s|${rootmnt}|/cow/|")" + local cow_dir="$(echo ${dest} | sed -e "s|^${rootmnt}|/cow/|")" else - cow_dir="/live/cow/${dest}" + # This is happens if persistence is activated + # post boot + local cow_dir="/live/cow/${dest}" fi - if [ -e "${cow_dir}" ] + if [ -e "${cow_dir}" ] && [ -z "${opt_linkfiles}" ] then # If an earlier custom mount has files here # it will "block" the current mount's files @@ -1521,11 +1545,6 @@ activate_custom_mounts () do_union ${dest} ${cow_dir} ${source} ${rofs_dest_backing} fi - if [ -n "${opt_linkfiles}" ] - then - link_files "${links_source}" "${links_dest}" "${rootmnt}" - fi - PERSISTENCE_IS_ON="1" export PERSISTENCE_IS_ON -- 2.1.4