#!/bin/sh
# DF-2905 build script — run INSIDE the guest as root (sh build.sh).
# Builds: mbread, and 4 KLD variants:
#   build_base_tail  (vulnerable subr_mchain.c, tail-leak test)
#   build_base_walk  (vulnerable subr_mchain.c, walk-correctness test)
#   build_fix_tail   (patched  subr_mchain.c, tail-leak test)
#   build_fix_walk   (patched  subr_mchain.c, walk-correctness test)
set -e
cd /root/df2905

cc -O -o mbread mbread.c

for V in base fix; do
  for M in tail walk; do
    D=build_${V}_${M}
    rm -rf $D
    mkdir -p $D
    cp mchain_leak.c Makefile $D/
    if [ "$V" = base ]; then
      cp /usr/src/sys/kern/libmchain/subr_mchain.c $D/subr_mchain.c
    else
      cp subr_mchain_fixed.c $D/subr_mchain.c
    fi
    if [ "$M" = walk ]; then
      printf '#define WALKTEST 1\n' > $D/walkflag.h
    else
      : > $D/walkflag.h
    fi
    ( cd $D && ln -sfn /usr/src/sys sys && make ) >build_${V}_${M}.log 2>&1
    test -f $D/mchainleak.ko
  done
done
echo "build OK:"
ls -l build_base_tail/mchainleak.ko build_base_walk/mchainleak.ko \
      build_fix_tail/mchainleak.ko build_fix_walk/mchainleak.ko
