#!/bin/sh
# DF-3095 fix validation (guest, root, PATCHED kernel):
#   - both crafted variants must be rejected at mount (ERANGE), guest stays up
#   - regression: stock image mounts and operates normally
set -e
uname -a
cc -O -o /root/tid_craft /root/tid_craft.c -I/usr/src/sys/vfs/hammer
truncate -s 4G /root/base.img
vnconfig -c vn0 /root/base.img
newfs_hammer -f -L ua3095 /dev/vn0 >/dev/null 2>&1
vnconfig -u vn0

echo "=== panic variant on PATCHED kernel (expect mount failure, no panic) ==="
cp /root/base.img /root/tid.img && /root/tid_craft /root/tid.img panic
vnconfig -c vn0 /root/tid.img
mount_hammer /dev/vn0 /mnt && echo UNEXPECTED_MOUNT_OK || echo MOUNT_REJECTED_AS_EXPECTED
mount | grep "/mnt " && umount /mnt || true
vnconfig -u vn0

echo "=== wrap variant on PATCHED kernel (expect mount failure, no panic) ==="
cp /root/base.img /root/tid2.img && /root/tid_craft /root/tid2.img wrap
vnconfig -c vn0 /root/tid2.img
mount_hammer /dev/vn0 /mnt && echo UNEXPECTED_MOUNT_OK || echo MOUNT_REJECTED_AS_EXPECTED
vnconfig -u vn0

echo "=== regression: stock image on PATCHED kernel (expect full operation) ==="
vnconfig -c vn0 /root/base.img
mount_hammer /dev/vn0 /mnt
for i in 1 2 3; do echo stock$i > /mnt/f$i; done
mkdir -p /mnt/w && chmod 777 /mnt/w
su -m maxx -c 'echo userwrite > /mnt/w/u1'
sync
ls -l /mnt /mnt/w
umount /mnt && echo STOCK_UMOUNT_OK
vnconfig -u vn0
echo FIX_VALIDATION_DONE
