#!/bin/sh
# DF-2663 kernel-B (fix) validation:
#  B1: DIOCGPART failure + oversized forged volume -> mount must be REJECTED
#      (fail-closed) instead of silently skipping the containment check.
#  B2: stock vn-truncate stale-read scenario (honest volu_size) -> mount OK
#      but read must return EIO, NOT 64KB of stale memory.
#  B3: regression - normal mount/read of intact image works.
exec > /root/poc/runB.log 2>&1
set -x
uname -a | head -1
for m in /mnt/h2; do timeout 10 umount -f $m 2>/dev/null; done
dmsetup remove_all 2>/dev/null
vnconfig -u vn0 2>/dev/null
mkdir -p /mnt/h2

echo "=== B1: sysctl=1 + forged 320MB volume -> expect mount REJECTED"
sysctl vfs.hammer2.df2663_fail_diocgpart=1
/root/poc/forge2663 /root/poc/base.img /root/poc/leak320B.img 0xC000010 0x00 0x14000000
vnconfig -c vn0 /root/poc/leak320B.img
truncate -s 201326592 /root/poc/leak320B.img
mount -t hammer2 -o ro /dev/vn0@leakfs /mnt/h2
echo "B1_MOUNT_RC=$?   (expect 1)"
dmesg | tail -2
ls /mnt/h2 2>&1
sysctl vfs.hammer2.df2663_fail_diocgpart=0
vnconfig -u vn0

echo "=== B2: honest volu_size + truncated backing -> expect EIO on read"
/root/poc/forge2663 /root/poc/base.img /root/poc/leakB2.img 0xC000010 0x00 0
vnconfig -c vn0 /root/poc/leakB2.img
truncate -s 201326592 /root/poc/leakB2.img
mount -t hammer2 -o ro /dev/vn0@leakfs /mnt/h2
echo "B2_MOUNT_RC=$?   (expect 0)"
cat /mnt/h2/leakfile > /root/poc/leakB2.bin 2>/root/poc/leakB2.err
echo "B2_READ_RC=$?   (expect 1)"
cat /root/poc/leakB2.err
ls -l /root/poc/leakB2.bin
umount /mnt/h2
vnconfig -u vn0

echo "=== B3: regression - intact image mounts and reads correctly"
vnconfig -c vn0 /root/poc/base.img
mount -t hammer2 -o ro /dev/vn0@leakfs /mnt/h2
echo "B3_MOUNT_RC=$?   (expect 0)"
md5 /mnt/h2/leakfile /root/poc/rand64
umount /mnt/h2
vnconfig -u vn0
echo KERNEL_B_VALIDATION_DONE
