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.