Files
erofs-freebsd-out-tree/tests/TC015-superblock-corrupted.md
T
2026-08-13 10:44:59 +02:00

2.2 KiB

Test Case: Corrupted Superblock Fields

Test ID: TC015-superblock-corrupted Category: Error Handling Priority: High

Objective

Verify ordered rejection of an unsupported block size, an image-bounds-invalid 48-bit root NID, and an unknown incompat feature. Every variant preserves provider length and carries a checksum valid for its encoded fields.

Fixture Qualification

work=$(mktemp -d /tmp/repo22-tc015.XXXXXX)
tests/prepare_error_fixtures.sh "$work/fixtures"
grep -E '^(bad-block-size|bad-root-nid|unsupported-feature) ' \
  "$work/fixtures/fixture-evidence.txt"
python3 tests/erofs_fixture.py inspect "$work/fixtures/bad-block-size.erofs"
python3 tests/erofs_fixture.py inspect "$work/fixtures/bad-root-nid.erofs"
python3 tests/erofs_fixture.py inspect "$work/fixtures/unsupported-feature.erofs"
(cd "$work/fixtures" && sha256 -c SHA256SUMS)

bad-block-size changes blkszbits at 1036 from 12 to 13 and recomputes the checksum over [1024,8192). bad-root-nid selects the 48-bit union form and sets rootnid_8b beyond the declared inode area. unsupported-feature sets unknown incompat bit 0x80000000.

FreeBSD Procedure

For each image, attach a dynamic vnode md unit, run mount directly and under truss, assert nonzero status and no mount entry, then detach that exact unit.

mkdir "$work/mnt"
for image in bad-block-size.erofs bad-root-nid.erofs unsupported-feature.erofs
do
  unit=$(mdconfig -a -t vnode -f "$work/fixtures/$image")
  set +e
  mount -t erofs -o ro "/dev/$unit" "$work/mnt" \
    >"$work/$image.out" 2>"$work/$image.err"
  status=$?
  set -e
  printf '%s status=%s\n' "$image" "$status"
  test "$status" -ne 0
  set +e
  truss -o "$work/$image.truss" mount -t erofs -o ro "/dev/$unit" \
    "$work/mnt" >/dev/null 2>&1
  set -e
  grep -E 'nmount.*ERR#' "$work/$image.truss"
  ! mount -p | awk -v path="$work/mnt" '$2 == path { found=1 }
    END { exit found ? 0 : 1 }'
  mdconfig -d -u "${unit#md}"
done

Expected Results

Bad block size returns EINVAL, bad root NID returns EINTEGRITY, and the unknown incompat bit returns EOPNOTSUPP. Record syscall errno, image hash, provider length, new dmesg lines, and cleanup for all three subcases.