Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94cbddd1 authored by Mark Salyzyn's avatar Mark Salyzyn Committed by android-build-merger
Browse files

Merge "fs_mgr: overlay: test assumption wrong if verity is enabled"

am: 4115c2ca

Change-Id: I0bdd2064ae0b6153e10f7c5c57660abd118cc00e
parents ebd9012b 4115c2ca
Loading
Loading
Loading
Loading
+140 −60
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ ESCAPE="`echo | tr '\n' '\033'`"
GREEN="${ESCAPE}[38;5;40m"
RED="${ESCAPE}[38;5;196m"
ORANGE="${ESCAPE}[38;5;255:165:0m"
BLUE="${ESCAPE}[35m"
NORMAL="${ESCAPE}[0m"

# Helper functions
@@ -138,6 +139,8 @@ fastboot_wait() {

[ "USAGE: adb_root

NB: This can be flakey on devices due to USB state

Returns: true if device in root state" ]
adb_root() {
  adb root >/dev/null </dev/null 2>/dev/null
@@ -159,6 +162,9 @@ fastboot_getvar() {
    false
    return
  fi
  if [ "${O}" != "${O#*FAILED}" ]; then
    O="${1}: <empty>"
  fi
  if [ -n "${2}" -a "${1}: ${2}" != "${O}" ]; then
    echo "${2} != ${O}" >&2
    false
@@ -167,14 +173,21 @@ fastboot_getvar() {
  echo ${O} >&2
}

[ "USAGE: die [-t <epoch>] [message] >/dev/stderr
[ "USAGE: die [-d|-t <epoch>] [message] >/dev/stderr

If -t <epoch> argument is supplied, dump logcat.
If -d, or -t <epoch> argument is supplied, dump logcat.

Returns: exit failure, report status" ]
die() {
  if [ X"-t" = X"${1}" -a -n "${2}" ]; then
  if [ X"-d" = X"${1}" ]; then
    adb_logcat -b all -v nsec -d >&2
    shift
  elif [ X"-t" = X"${1}" ]; then
    if [ -n "${2}" ]; then
      adb_logcat -b all -v nsec -t ${2} >&2
    else
      adb_logcat -b all -v nsec -d >&2
    fi
    shift 2
  fi
  echo "${RED}[  FAILED  ]${NORMAL} ${@}" >&2
@@ -238,15 +251,20 @@ check_eq() {
    die "${@}"
}

[ "USAGE: skip_administrative_mounts < /proc/mounts
[ "USAGE: skip_administrative_mounts [data] < /proc/mounts

Filters out all administrative (eg: sysfs) mounts uninteresting to the test" ]
skip_administrative_mounts() {
  if [ "data" = "${1}" ]; then
    grep -v " /data "
  else
    cat -
  fi |
  grep -v \
    -e "^\(overlay\|tmpfs\|none\|sysfs\|proc\|selinuxfs\|debugfs\) " \
    -e "^\(bpf\|cg2_bpf\|pstore\|tracefs\|adb\|mtp\|ptp\|devpts\) " \
    -e "^\(/data/media\|/dev/block/loop[0-9]*\) " \
    -e " /\(cache\|mnt/scratch\|mnt/vendor/persist\|metadata\|data\) "
    -e " /\(cache\|mnt/scratch\|mnt/vendor/persist\|metadata\) "
}

if [ X"-s" = X"${1}" -a -n "${2}" ]; then
@@ -263,6 +281,9 @@ inAdb || die "device not in adb mode"
isDebuggable || die "device not a debug build"

# Do something

echo "${GREEN}[ RUN      ]${NORMAL} Testing kernel support for overlayfs" >&2

adb_wait || die "wait for device failed"
adb_sh ls -d /sys/module/overlay </dev/null >/dev/null &&
  echo "${GREEN}[       OK ]${NORMAL} overlay module present" >&2 ||
@@ -272,6 +293,9 @@ adb_su ls /sys/module/overlay/parameters/override_creds </dev/null >/dev/null &&
  die "overlay module can not be used on ANDROID"
adb_root ||
  die "initial setup"

echo "${GREEN}[ RUN      ]${NORMAL} Checking current overlayfs status" >&2

reboot=false
OVERLAYFS_BACKING="cache mnt/scratch"
for d in ${OVERLAYFS_BACKING}; do
@@ -297,64 +321,90 @@ D=`adb_sh df -k </dev/null` &&
  echo "${ORANGE}[  WARNING ]${NORMAL} overlays present before setup" >&2 ||
  echo "${GREEN}[       OK ]${NORMAL} no overlay present before setup" >&2
adb_sh df -k `adb_sh cat /proc/mounts |
                skip_administrative_mounts |
                skip_administrative_mounts data |
                cut -s -d' ' -f1`

echo "${GREEN}[ RUN      ]${NORMAL} disable verity" >&2

T=`adb_date`
D=`adb disable-verity 2>&1`
err=${?}
echo "${D}"
if [ ${err} != 0 -o X"${D}" != X"${D##*setup failed}" ]; then
  echo "${D%?Now reboot your device for settings to take effect}"
  die -t ${T} "setup for overlay"
fi
if [ X"${D}" != X"${D##*using overlayfs}" ]; then
  echo "${GREEN}[       OK ]${NORMAL} using overlayfs" >&2
fi
adb_reboot &&
  adb_wait &&
reboot=false
if [ X"${D}" != X"${D##*Successfully disabled verity}" ]; then
  echo "${GREEN}[       OK ]${NORMAL} disabled verity" >&2
  reboot=true
else
  echo "${ORANGE}[  WARNING ]${NORMAL} verity already disabled" >&2
fi
D=`adb_sh df -k </dev/null` &&
  H=`echo "${D}" | head -1` &&
  D=`echo "${D}" | grep "^overlay "` &&
  echo "${H}" &&
  echo "${D}" ||
  die "overlay takeover failed"
echo "${D}" | grep "^overlay .* /system\$" >/dev/null ||
  echo "${ORANGE}[  WARNING ]${NORMAL} overlay takeover before remount not complete" >&2
  D=`echo "${D}" | grep "^overlay " | true` &&
  [ -n "${D}" ] &&
  ( echo "${H}" && echo "${D}" && true ) &&
  die -t ${T} "overlay takeover unexpected"
L=
if ${reboot}; then
  L=`adb_logcat -b all -v nsec -t ${T} 2>&1`
  adb_reboot &&
    adb_wait 2m ||
    die "reboot after verity disabled failed"
  T=
fi

echo "${GREEN}[ RUN      ]${NORMAL} remount" >&2

T=`adb_date`
adb_root &&
  adb remount &&
  D=`adb_sh df -k </dev/null` ||
  die -t ${T} "can not collect filesystem data"
  adb remount ||
  ( [ -n "${L}" ] && echo "${L}" && false ) ||
  die -t "${T}" "adb remount failed"
D=`adb_sh df -k </dev/null` &&
  H=`echo "${D}" | head -1` &&
  D=`echo "${D}" | grep "^overlay "` ||
  ( [ -n "${L}" ] && echo "${L}" && false ) ||
  die -t ${T} "overlay takeover failed"
echo "${D}" | grep "^overlay .* /system\$" >/dev/null ||
  echo "${ORANGE}[  WARNING ]${NORMAL} overlay takeover not complete" >&2
scratch_partition=scratch
if echo "${D}" | grep " /mnt/scratch" >/dev/null; then
  echo "${ORANGE}[     INFO ]${NORMAL} using scratch dynamic partition for overrides" >&2
  H=`adb_sh cat /proc/mounts | sed -n 's@\([^ ]*\) /mnt/scratch \([^ ]*\) .*@\2 on \1@p'`
  [ -n "${H}" ] &&
    echo "${ORANGE}[     INFO ]${NORMAL} scratch filesystem ${H}"
  echo "${BLUE}[     INFO ]${NORMAL} using ${scratch_partition} dynamic partition for overrides" >&2
fi
M=`adb_sh cat /proc/mounts | sed -n 's@\([^ ]*\) /mnt/scratch \([^ ]*\) .*@\2 on \1@p'`
[ -n "${M}" ] &&
  echo "${BLUE}[     INFO ]${NORMAL} scratch filesystem ${M}"
scratch_size=`adb_sh df -k /mnt/scratch </dev/null 2>/dev/null |
              while read device kblocks used available use mounted on; do
                if [ "/mnt/scratch" = "\${mounted}" ]; then
                  echo \${kblocks}
                fi
              done` &&
  [ -n "${scratch_size}" ] ||
  die "scratch size"
echo "${BLUE}[     INFO ]${NORMAL} scratch size ${scratch_size}KB" >&2
for d in ${OVERLAYFS_BACKING}; do
  if adb_sh ls -d /${d}/overlay/system/upper </dev/null >/dev/null 2>/dev/null; then
    echo "${ORANGE}[     INFO ]${NORMAL} /${d}/overlay is setup" >&2
    echo "${BLUE}[     INFO ]${NORMAL} /${d}/overlay is setup" >&2
  fi
done

H=`echo "${D}" | head -1` &&
  D=`echo "${D}" | grep "^overlay "` &&
echo "${H}" &&
  echo "${D}" &&
  echo "${D}" | grep "^overlay .* /system\$" >/dev/null ||
  die  "overlay takeover after remount"
!(adb_sh grep "^overlay " /proc/mounts </dev/null | grep " overlay ro,") &&
  !(adb_sh grep " rw," /proc/mounts </dev/null | skip_administrative_mounts) ||
  !(adb_sh grep " rw," /proc/mounts </dev/null | skip_administrative_mounts data) ||
  die "remount overlayfs missed a spot (ro)"

adb_su "sed -n '1,/overlay \\/system/p' /proc/mounts" </dev/null |
  skip_administrative_mounts |
  grep -v ' \(squashfs\|ext4\|f2fs\) ' &&
  echo "${ORANGE}[  WARNING ]${NORMAL} overlay takeover after first stage init" >&2 ||
  echo "${GREEN}[       OK ]${NORMAL} overlay takeover in first stage init" >&2

# Check something

echo "${GREEN}[ RUN      ]${NORMAL} push content to system and vendor" >&2

A="Hello World! $(date)"
echo "${A}" | adb_sh "cat - > /system/hello"
echo "${A}" | adb_sh "cat - > /vendor/hello"
@@ -364,8 +414,25 @@ check_eq "${A}" "${B}" system before reboot
B="`adb_cat /vendor/hello`" ||
  die "vendor hello"
check_eq "${A}" "${B}" vendor before reboot

echo "${GREEN}[ RUN      ]${NORMAL} reboot to confirm content persistent" >&2

adb_reboot &&
  adb_wait &&
  adb_wait 2m ||
  die "reboot after override content added failed"

D=`adb_su df -k </dev/null` &&
  H=`echo "${D}" | head -1` &&
  D=`echo "${D}" | grep "^overlay "` ||
  ( echo "${L}" && false ) ||
  die -d "overlay takeover failed after reboot"

adb_su "sed -n '1,/overlay \\/system/p' /proc/mounts" </dev/null |
  skip_administrative_mounts |
  grep -v ' \(squashfs\|ext4\|f2fs\) ' &&
  echo "${ORANGE}[  WARNING ]${NORMAL} overlay takeover after first stage init" >&2 ||
  echo "${GREEN}[       OK ]${NORMAL} overlay takeover in first stage init" >&2

B="`adb_cat /system/hello`" ||
  die "re-read system hello after reboot"
check_eq "${A}" "${B}" system after reboot
@@ -378,23 +445,30 @@ adb_root &&
  die "re-read vendor hello after reboot"
check_eq "${A}" "${B}" vendor after reboot

echo "${GREEN}[ RUN      ]${NORMAL} flash vendor, confirm its content disappears" >&2

[ -n "${ANDROID_PRODUCT_OUT}" ] &&
  adb reboot-fastboot &&
  fastboot_wait 2m &&
  fastboot flash vendor ||
  die "fastbootd flash vendor"
# check scratch via fastboot
fastboot_getvar partition-type:scratch raw &&
  fastboot_getvar has-slot:scratch no &&
  fastboot_getvar is-logical:scratch yes ||
  die "fastboot can not see scratch parameters"
echo "${ORANGE}[     INFO ]${NORMAL} expect fastboot erase scratch to fail" >&2
fastboot erase scratch &&
  die "fastbootd can erase scratch"
echo "${ORANGE}[     INFO ]${NORMAL} expect fastboot format scratch to fail" >&2
fastboot format scratch &&
  die "fastbootd can format scratch"
  ( fastboot reboot && false) ||
  die "fastboot flash vendor"
# check ${scratch_partition} via fastboot
fastboot_getvar partition-type:${scratch_partition} raw &&
  fastboot_getvar has-slot:${scratch_partition} no &&
  fastboot_getvar is-logical:${scratch_partition} yes ||
  ( fastboot reboot && false) ||
  die "fastboot can not see ${scratch_partition} parameters"
echo "${BLUE}[     INFO ]${NORMAL} expect fastboot erase ${scratch_partition} to fail" >&2
fastboot erase ${scratch_partition} &&
  ( fastboot reboot || true) &&
  die "fastboot can erase ${scratch_partition}"
echo "${BLUE}[     INFO ]${NORMAL} expect fastboot format ${scratch_partition} to fail" >&2
fastboot format ${scratch_partition} &&
  ( fastboot reboot || true) &&
  die "fastboot can format ${scratch_partition}"
fastboot reboot ||
  die "can not reboot out of fastbootd"
  die "can not reboot out of fastboot"
echo "${ORANGE}[  WARNING ]${NORMAL} adb after fastboot ... waiting 2 minutes"
adb_wait 2m ||
  die "did not reboot after flash"
@@ -417,6 +491,8 @@ B="`adb_cat /vendor/hello`" &&
  die "re-read vendor hello after flash vendor"
check_eq "cat: /vendor/hello: No such file or directory" "${B}" vendor after flash vendor

echo "${GREEN}[ RUN      ]${NORMAL} remove test content (cleanup)" >&2

T=`adb_date`
adb remount &&
  ( adb_sh rm /vendor/hello </dev/null 2>/dev/null || true ) &&
@@ -429,17 +505,20 @@ B="`adb_cat /vendor/hello`" &&
  die "re-read vendor hello after rm"
check_eq "cat: /vendor/hello: No such file or directory" "${B}" after flash rm

echo "${GREEN}[ RUN      ]${NORMAL} test fastboot flash to ${scratch_partition}" >&2

adb reboot-fastboot &&
  dd if=/dev/zero of=adb-remount-test.img bs=4096 count=16 &&
  dd if=/dev/zero of=/tmp/adb-remount-test.img bs=4096 count=16 2>/dev/null &&
  fastboot_wait 2m ||
  die "reboot into fastbootd"
fastboot flash scratch adb-remount-test.img
  ( rm /tmp/adb-remount-test.img && false) ||
  die "reboot into fastboot"
fastboot flash ${scratch_partition} /tmp/adb-remount-test.img
err=${?}
rm adb-remount-test.img
[ 0 -eq ${err} ] ||
  die "fastbootd flash scratch"
rm /tmp/adb-remount-test.img
fastboot reboot ||
  die "can not reboot out of fastbootd"
  die "can not reboot out of fastboot"
[ 0 -eq ${err} ] ||
  die "fastboot flash ${scratch_partition}"
adb_wait 2m &&
  adb_root ||
  die "did not reboot after flash"
@@ -449,7 +528,8 @@ err=${?}
echo "${D}"
[ ${err} = 0 ] &&
  [ X"${D}" = X"${D##*setup failed}" ] &&
  [ X"${D}" != X"${D##*using overlayfs}" ] ||
  [ X"${D}" != X"${D##*using overlayfs}" ] &&
  echo "${GREEN}[       OK ]${NORMAL} ${scratch_partition} recreated" >&2 ||
  die -t ${T} "setup for overlayfs"

echo "${GREEN}[  PASSED  ]${NORMAL} adb remount" >&2