DragonFlyBSD Kernel Audit
DF-1095 / verify.sh
← back to finding ↓ download raw
#!/bin/sh
# DF-1095 static source-verification: iicsmb_bwrite missing iicbus_stop.
set +e
PASS=0; FAIL=0
check() {
	if eval "$2"; then
		echo "PASS  $1"
		PASS=$((PASS+1))
	else
		echo "FAIL  $1"
		FAIL=$((FAIL+1))
	fi
}

I=sys/bus/iicbus/iicsmb.c
C=sys/bus/iicbus/iiconf.c

# 1. iicsmb_bwrite's error label does NOT call iicbus_stop
check "iicsmb_bwrite error: label has NO iicbus_stop" \
	'awk "/^iicsmb_bwrite/,/^}/" '"$I"' | awk "/^error:/,/^}/" | grep -q "return" && ! awk "/^iicsmb_bwrite/,/^}/" '"$I"' | awk "/^error:/,/^}/" | grep -q "iicbus_stop"'

# 2. iicsmb_bwrite calls iicbus_start with goto error (success path sets started)
check "iicsmb_bwrite calls iicbus_start -> goto error on failure" \
	'awk "/^iicsmb_bwrite/,/^}/" '"$I"' | grep -q "iicbus_start(parent, slave & ~LSB, IICBUS_TIMEOUT)"'

# 3. Control case: iicsmb_bread DOES call iicbus_stop in error label
check "iicsmb_bread error: DOES call iicbus_stop (control case)" \
	'awk "/^iicsmb_bread/,/^}/" '"$I"' | awk "/^error:/,/^}/" | grep -q "iicbus_stop(parent)"'

# 4. iicbus_start sets sc->started = slave on success
check "iicbus_start sets sc->started on success" \
	'awk "/^iicbus_start/,/^}/" '"$C"' | grep -q "sc->started = slave"'

# 5. iicbus_start returns EINVAL if already started
check "iicbus_start returns EINVAL when started is set" \
	'awk "/^iicbus_start/,/^}/" '"$C"' | grep -q "if (sc->started)" && awk "/^iicbus_start/,/^}/" '"$C"' | grep -q "return (EINVAL)"'

# 6. iicbus_stop clears sc->started
check "iicbus_stop clears sc->started" \
	'awk "/^iicbus_stop/,/^}/" '"$C"' | grep -q "sc->started = 0"'

# 7. iicsmb is configured in the kernel
check "iicsmb is built (bus/iicbus/iicsmb.c in conf/files)" \
	'grep -q "bus/iicbus/iicsmb.c" sys/conf/files'

# 8. iicbus_request_bus / iicbus_release_bus do NOT touch sc->started
check "iicbus_request_bus / iicbus_release_bus do NOT touch sc->started" \
	'! awk "/^iicbus_request_bus/,/^}/" '"$C"' | grep -q "sc->started" && ! awk "/^iicbus_release_bus/,/^}/" '"$C"' | grep -q "sc->started"'

echo
echo "PASS=$PASS FAIL=$FAIL"