Sysctl test will fail in some items if the value of /proc/sys/kernel /sysctrl_writes_strict is 0 as the default value in kernel older than v4.5. Make this test more robus and compatible with older kernel by checking and update writes_strict value and restore it when test is done. Signed-off-by: Orson Zhai <orson.zhai@linaro.org> Reviewed-by: Sumit Semwal <sumit.semwal@linaro.org> Tested-by: Sumit Semwal <sumit.semwal@linaro.org> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
132 lines
2.3 KiB
Bash
132 lines
2.3 KiB
Bash
#!/bin/sh
|
|
|
|
TEST_FILE=$(mktemp)
|
|
|
|
echo "== Testing sysctl behavior against ${TARGET} =="
|
|
|
|
set_orig()
|
|
{
|
|
echo "${ORIG}" > "${TARGET}"
|
|
}
|
|
|
|
set_test()
|
|
{
|
|
echo "${TEST_STR}" > "${TARGET}"
|
|
}
|
|
|
|
verify()
|
|
{
|
|
local seen
|
|
seen=$(cat "$1")
|
|
if [ "${seen}" != "${TEST_STR}" ]; then
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
exit_test()
|
|
{
|
|
if [ ! -z ${old_strict} ]; then
|
|
echo ${old_strict} > ${WRITES_STRICT}
|
|
fi
|
|
exit $rc
|
|
}
|
|
|
|
trap 'set_orig; rm -f "${TEST_FILE}"' EXIT
|
|
|
|
rc=0
|
|
|
|
echo -n "Writing test file ... "
|
|
echo "${TEST_STR}" > "${TEST_FILE}"
|
|
if ! verify "${TEST_FILE}"; then
|
|
echo "FAIL" >&2
|
|
exit 1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Checking sysctl is not set to test value ... "
|
|
if verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
exit 1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Writing sysctl from shell ... "
|
|
set_test
|
|
if ! verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
exit 1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Resetting sysctl to original value ... "
|
|
set_orig
|
|
if verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
exit 1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Checking write strict setting ... "
|
|
WRITES_STRICT="${SYSCTL}/kernel/sysctl_writes_strict"
|
|
if [ ! -e ${WRITES_STRICT} ]; then
|
|
echo "FAIL, but skip in case of old kernel" >&2
|
|
else
|
|
old_strict=$(cat ${WRITES_STRICT})
|
|
if [ "$old_strict" = "1" ]; then
|
|
echo "ok"
|
|
else
|
|
echo "FAIL, strict value is 0 but force to 1 to continue" >&2
|
|
echo "1" > ${WRITES_STRICT}
|
|
fi
|
|
fi
|
|
|
|
# Now that we've validated the sanity of "set_test" and "set_orig",
|
|
# we can use those functions to set starting states before running
|
|
# specific behavioral tests.
|
|
|
|
echo -n "Writing entire sysctl in single write ... "
|
|
set_orig
|
|
dd if="${TEST_FILE}" of="${TARGET}" bs=4096 2>/dev/null
|
|
if ! verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
rc=1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Writing middle of sysctl after synchronized seek ... "
|
|
set_test
|
|
dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 skip=1 2>/dev/null
|
|
if ! verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
rc=1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Writing beyond end of sysctl ... "
|
|
set_orig
|
|
dd if="${TEST_FILE}" of="${TARGET}" bs=20 seek=2 2>/dev/null
|
|
if verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
rc=1
|
|
else
|
|
echo "ok"
|
|
fi
|
|
|
|
echo -n "Writing sysctl with multiple long writes ... "
|
|
set_orig
|
|
(perl -e 'print "A" x 50;'; echo "${TEST_STR}") | \
|
|
dd of="${TARGET}" bs=50 2>/dev/null
|
|
if verify "${TARGET}"; then
|
|
echo "FAIL" >&2
|
|
rc=1
|
|
else
|
|
echo "ok"
|
|
fi
|