Module Name: src Committed By: kamil Date: Sun Apr 8 17:20:18 UTC 2018
Modified Files: src/tests/lib/libc/sys: t_ptrace_x86_wait.h Log Message: Add check in ATF tests for security.models.extensions.user_set_dbregs Introduce a new function can_we_set_dbregs() in the ATF ptrace(2) tests. It uses lazy-bool evaluation whether a process can call PT_SETDBREGS. In case of not being able to do so, print a message and mark a test as skipped: Either run this test as root or set sysctl(3) security.models.extensions.user_set_dbregs to 1 No functional change intended to the code flow of the existing tested scenarios. Sponsored by <The NetBSD Foundation> To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/tests/lib/libc/sys/t_ptrace_x86_wait.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/sys/t_ptrace_x86_wait.h diff -u src/tests/lib/libc/sys/t_ptrace_x86_wait.h:1.4 src/tests/lib/libc/sys/t_ptrace_x86_wait.h:1.5 --- src/tests/lib/libc/sys/t_ptrace_x86_wait.h:1.4 Tue Mar 6 21:11:51 2018 +++ src/tests/lib/libc/sys/t_ptrace_x86_wait.h Sun Apr 8 17:20:18 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: t_ptrace_x86_wait.h,v 1.4 2018/03/06 21:11:51 kamil Exp $ */ +/* $NetBSD: t_ptrace_x86_wait.h,v 1.5 2018/04/08 17:20:18 kamil Exp $ */ /*- * Copyright (c) 2016 The NetBSD Foundation, Inc. @@ -57,6 +57,33 @@ union u { } bits; }; +static bool +can_we_set_dbregs(void) +{ + static long euid = -1; + static int user_set_dbregs = -1; + size_t user_set_dbregs_len = sizeof(user_set_dbregs); + + if (euid == -1) + euid = geteuid(); + + if (euid == 0) + return true; + + if (user_set_dbregs == -1) { + if (sysctlbyname("security.models.extensions.user_set_dbregs", + &user_set_dbregs, &user_set_dbregs_len, NULL, 0) + == -1) { + return false; + } + } + + if (user_set_dbregs > 0) + return true; + else + return false; +} + ATF_TC(dbregs_print); ATF_TC_HEAD(dbregs_print, tc) { @@ -135,6 +162,11 @@ dbreg_preserve(int reg, enum dbreg_prese size_t i; int watchme; + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + DPRINTF("Before forking process PID=%d\n", getpid()); SYSCALL_REQUIRE((child = fork()) != -1); if (child == 0) { @@ -389,6 +421,11 @@ dbregs_trap_variable(int reg, int cond, struct ptrace_siginfo info; memset(&info, 0, sizeof(info)); + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + dr7.raw = 0; switch (reg) { case 0: @@ -1101,6 +1138,11 @@ ATF_TC_BODY(dbregs_dr0_trap_code, tc) struct ptrace_siginfo info; memset(&info, 0, sizeof(info)); + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + dr7.raw = 0; dr7.bits.global_dr0_breakpoint = 1; dr7.bits.condition_dr0 = 0; /* 0b00 -- break on code execution */ @@ -1228,6 +1270,11 @@ ATF_TC_BODY(dbregs_dr1_trap_code, tc) struct ptrace_siginfo info; memset(&info, 0, sizeof(info)); + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + dr7.raw = 0; dr7.bits.global_dr1_breakpoint = 1; dr7.bits.condition_dr1 = 0; /* 0b00 -- break on code execution */ @@ -1355,6 +1402,11 @@ ATF_TC_BODY(dbregs_dr2_trap_code, tc) struct ptrace_siginfo info; memset(&info, 0, sizeof(info)); + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + dr7.raw = 0; dr7.bits.global_dr2_breakpoint = 1; dr7.bits.condition_dr2 = 0; /* 0b00 -- break on code execution */ @@ -1482,6 +1534,11 @@ ATF_TC_BODY(dbregs_dr3_trap_code, tc) struct ptrace_siginfo info; memset(&info, 0, sizeof(info)); + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + dr7.raw = 0; dr7.bits.global_dr3_breakpoint = 1; dr7.bits.condition_dr3 = 0; /* 0b00 -- break on code execution */ @@ -1614,6 +1671,11 @@ dbregs_dont_inherit_lwp(int reg) struct dbreg r1; struct dbreg r2; + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + DPRINTF("Before forking process PID=%d\n", getpid()); SYSCALL_REQUIRE((child = fork()) != -1); if (child == 0) { @@ -1785,6 +1847,11 @@ dbregs_dont_inherit_execve(int reg) struct ptrace_siginfo info; memset(&info, 0, sizeof(info)); + if (!can_we_set_dbregs()) { + atf_tc_skip("Either run this test as root or set sysctl(3) " + "security.models.extensions.user_set_dbregs to 1"); + } + DPRINTF("Before forking process PID=%d\n", getpid()); SYSCALL_REQUIRE((child = fork()) != -1); if (child == 0) {