test: check for CAP_SYS_PTRACE before testing for an attached debugger

If we don't have the capability to ptrace, we are probably running inside a
container, not the debugger. Check this first so we don't disable forking
mode.

Make this conditional on libcap - where libcap is not available always assume
we *do not* have a debugger attached. This is easier than telling everyone who
runs the tests in a confined system to install libcap.

Fixes #1285
This commit is contained in:
Peter Hutterer 2021-06-10 16:11:43 +10:00 committed by Wim Taymans
parent 2d238f1d33
commit 7177d82c34
3 changed files with 19 additions and 1 deletions

View file

@ -9,6 +9,7 @@ pwtest_deps = [
pipewire_dep,
mathlib,
dl_lib,
cap_lib,
]
pwtest_c_args = [

View file

@ -37,6 +37,9 @@
#include <unistd.h>
#include <signal.h>
#include <syscall.h>
#if HAVE_LIBCAP
#include <sys/capability.h>
#endif
#include <sys/epoll.h>
#include <sys/ptrace.h>
#include <sys/resource.h>
@ -1135,8 +1138,9 @@ static void list_tests(struct pwtest_context *ctx)
static bool is_debugger_attached(void)
{
bool rc = false;
#if HAVE_LIBCAP
int status;
bool rc;
int pid = fork();
if (pid == -1)
@ -1144,6 +1148,13 @@ static bool is_debugger_attached(void)
if (pid == 0) {
int ppid = getppid();
cap_t caps = cap_get_pid(ppid);
cap_flag_value_t cap_val;
if (cap_get_flag(caps, CAP_SYS_PTRACE, CAP_EFFECTIVE, &cap_val) == -1 ||
cap_val != CAP_SET)
_exit(false);
if (ptrace(PTRACE_ATTACH, ppid, NULL, 0) == 0) {
waitpid(ppid, NULL, 0);
ptrace(PTRACE_CONT, ppid, NULL, 0);
@ -1158,6 +1169,7 @@ static bool is_debugger_attached(void)
rc = WEXITSTATUS(status);
}
#endif
return !!rc;
}