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

1.6 KiB

Test Case: Reserved Inode Format Rejection

Test ID: TC113-corrupted-inode Category: Error Handling Priority: Critical

Objective

Verify a checksum-valid image mounts, but lookup/open of the resolved /inode-target.txt inode with reserved i_format bit 0x8000 fails with EOPNOTSUPP; an unaffected file must remain readable.

Fixture Qualification

work=$(mktemp -d /tmp/repo22-tc113.XXXXXX)
tests/prepare_error_fixtures.sh "$work/fixtures"
cc -O2 -Wall -Wextra -std=c17 tests/read_probe.c -o "$work/read_probe"
python3 tests/erofs_fixture.py inspect \
  "$work/fixtures/bad-inode-format.erofs" --path /inode-target.txt
grep '^bad-inode-format ' "$work/fixtures/fixture-evidence.txt"
sha256 -q "$work/fixtures/bad-inode-format.erofs"

The mutator resolves the root dirent, calculates the inode byte offset from the metadata block and NID, asserts the old format, sets only reserved bit 0x8000, recomputes CRC32C, and preserves provider length.

FreeBSD Procedure

mkdir "$work/mnt"
unit=$(mdconfig -a -t vnode -f "$work/fixtures/bad-inode-format.erofs")
mount -t erofs -o ro "/dev/$unit" "$work/mnt"
cmp "$work/fixtures/source/control.txt" "$work/mnt/control.txt"
truss -o "$work/read.truss" "$work/read_probe" expect-error \
  "$work/mnt/inode-target.txt" 45 | tee "$work/error.out"
grep -q 'expected_errno=45' "$work/error.out"
grep -E '(openat|read).*ERR#45' "$work/read.truss"
cmp "$work/fixtures/source/control.txt" "$work/mnt/control.txt"
umount "$work/mnt"
mdconfig -d -u "${unit#md}"

Expected Results

Only the target returns errno 45 (EOPNOTSUPP). The mount remains usable and cleans up fully.