#!/bin/sh
# DF-2237 fix validation: revert to built snapshot, apply fix.diff to the
# guest /usr/src copy, rebuild libiconv.ko, load the PATCHED module, re-arm
# the same tables and re-run controls + BOTH triggers. Success criteria:
#  - control conversions bit-identical to baseline (mode 0)
#  - triggers SURVIVE with ret=-1 (same path as a normal miss), no panic
set -e
cd "$(dirname "$0")"
VM=../../../dfbsd-qemu/vm.sh
CFG=../../../dfbsd-qemu/config

echo "== PF: revert to built snapshot =="
$VM reset df2237-built

echo "== push fix.diff =="
$VM run_root 'mkdir -p /root/df2237'
scp -q -F $CFG fix.diff dfbsd:/root/df2237/

echo "== push + apply fix to /usr/src =="
$VM run_root 'cd /usr/src && patch -s -p1 --dry-run < /root/df2237/fix.diff && \
  patch -s -p1 < /root/df2237/fix.diff && echo PATCHED && \
  grep -n "may have moved c1/c2" /usr/src/sys/libiconv/iconv_xlat16.c'

echo "== rebuild libiconv.ko =="
$VM run_root 'cd /usr/src/sys/libiconv && make obj cleandepend && make depend && make' \
  2>&1 | tee fixbuild.log
$VM run_root 'KO=$(/usr/bin/find /usr/obj -name libiconv.ko | head -1); echo "patched ko: $KO"; \
  ls -l $KO; nm $KO | grep " iconv_conv_case"; \
  strings $KO >/dev/null'

echo "== load PATCHED module, arm tables, run controls (mode 0) =="
$VM run_root 'KO=$(/usr/bin/find /usr/obj -name libiconv.ko | head -1); \
  kldload $KO && /root/df2237/armtbl && kldstat; \
  kldload /usr/obj/root/df2237/km0/df2237_0.ko' 2>&1 | tee fix_controls.log

echo "== fire single-byte trigger against PATCHED kernel module =="
$VM run_root 'kldload /usr/obj/root/df2237/km1/df2237_1.ko; echo "km1 kldload rc=$?"; \
  sysctl debug.debugger_on_panic=0 debug.trace_on_panic=0' 2>&1 | tee fix_t1.log || true
sleep 3
$VM status || true

echo "== fire double-byte trigger against PATCHED kernel module =="
timeout 90 $VM run_root 'kldload /usr/obj/root/df2237/km2/df2237_2.ko; echo "km2 kldload rc=$?"' \
  2>&1 | tee fix_t2.log || true
sleep 5
cp ../../../dfbsd-qemu/boot.log fix_boot.log || true
$VM run_root 'dmesg | tail -40' 2>&1 | tee fix_dmesg.txt || true
$VM status || true
