| Index: scripts/image_signing/common.sh
|
| diff --git a/scripts/image_signing/common.sh b/scripts/image_signing/common.sh
|
| index 7b6dc9f327bab8242a982bda4bbbbe820be280dc..17c01ba4bc1739aa77f7db6d2971e7c8d21a5543 100755
|
| --- a/scripts/image_signing/common.sh
|
| +++ b/scripts/image_signing/common.sh
|
| @@ -85,6 +85,9 @@ mount_image_partition() {
|
| local partnum=$2
|
| local mount_dir=$3
|
| local offset=$(partoffset "$image" "$partnum")
|
| + # Forcibly call enable_rw_mount. It should fail on unsupported filesystems
|
| + # and be idempotent on ext*.
|
| + enable_rw_mount "$image" $((offset * 512)) 2> /dev/null
|
| sudo mount -o loop,offset=$((offset * 512)) "$image" "$mount_dir"
|
| if is_rootfs_partition "$mount_dir"; then
|
| tag_as_needs_to_be_resigned "$mount_dir"
|
| @@ -161,5 +164,79 @@ ensure_files_exist() {
|
| return $return_value
|
| }
|
|
|
| +# For details, see crosutils.git/common.sh
|
| +enable_rw_mount() {
|
| + local rootfs="$1"
|
| + local offset="${2-0}"
|
| +
|
| + # Make sure we're checking an ext2 image
|
| + if ! is_ext2 "$rootfs" $offset; then
|
| + echo "enable_rw_mount called on non-ext2 filesystem: $rootfs $offset" 1>&2
|
| + return 1
|
| + fi
|
| +
|
| + local ro_compat_offset=$((0x464 + 3)) # Set 'highest' byte
|
| + # Dash can't do echo -ne, but it can do printf "\NNN"
|
| + # We could use /dev/zero here, but this matches what would be
|
| + # needed for disable_rw_mount (printf '\377').
|
| + printf '\000' |
|
| + sudo dd of="$rootfs" seek=$((offset + ro_compat_offset)) \
|
| + conv=notrunc count=1 bs=1
|
| +}
|
| +
|
| +# For details, see crosutils.git/common.sh
|
| +is_ext2() {
|
| + local rootfs="$1"
|
| + local offset="${2-0}"
|
| +
|
| + # Make sure we're checking an ext2 image
|
| + local sb_magic_offset=$((0x438))
|
| + local sb_value=$(sudo dd if="$rootfs" skip=$((offset + sb_magic_offset)) \
|
| + count=2 bs=1 2>/dev/null)
|
| + local expected_sb_value=$(printf '\123\357')
|
| + if [ "$sb_value" = "$expected_sb_value" ]; then
|
| + return 0
|
| + fi
|
| + return 1
|
| +}
|
| +
|
| +disable_rw_mount() {
|
| + local rootfs="$1"
|
| + local offset="${2-0}"
|
| +
|
| + # Make sure we're checking an ext2 image
|
| + if ! is_ext2 "$rootfs" $offset; then
|
| + echo "disable_rw_mount called on non-ext2 filesystem: $rootfs $offset" 1>&2
|
| + return 1
|
| + fi
|
| +
|
| + local ro_compat_offset=$((0x464 + 3)) # Set 'highest' byte
|
| + # Dash can't do echo -ne, but it can do printf "\NNN"
|
| + # We could use /dev/zero here, but this matches what would be
|
| + # needed for disable_rw_mount (printf '\377').
|
| + printf '\377' |
|
| + sudo dd of="$rootfs" seek=$((offset + ro_compat_offset)) \
|
| + conv=notrunc count=1 bs=1
|
| +}
|
| +
|
| +rw_mount_disabled() {
|
| + local rootfs="$1"
|
| + local offset="${2-0}"
|
| +
|
| + # Make sure we're checking an ext2 image
|
| + if ! is_ext2 "$rootfs" $offset; then
|
| + return 2
|
| + fi
|
| +
|
| + local ro_compat_offset=$((0x464 + 3)) # Set 'highest' byte
|
| + local ro_value=$(sudo dd if="$rootfs" skip=$((offset + ro_compat_offset)) \
|
| + count=1 bs=1 2>/dev/null)
|
| + local expected_ro_value=$(printf '\377')
|
| + if [ "$ro_value" = "$expected_ro_value" ]; then
|
| + return 0
|
| + fi
|
| + return 1
|
| +}
|
| +
|
| trap "cleanup_temps_and_mounts" EXIT
|
|
|
|
|