DF-2237 / pf_fix.sh
#!/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 |