diff --git a/meson.build b/meson.build index 53f22a8da..e0e7a66e9 100644 --- a/meson.build +++ b/meson.build @@ -323,6 +323,11 @@ sndfile_dep = dependency('sndfile', version : '>= 1.0.20', required : get_option pulseaudio_dep = dependency('libpulse', required : get_option('libpulse')) avahi_dep = dependency('avahi-client', required : get_option('avahi')) +cap_lib = dependency('libcap', required : false) +if cap_lib.found() + cdata.set('HAVE_LIBCAP', 1) +endif + gst_option = get_option('gstreamer') gst_deps_def = { 'glib-2.0': {'version': '>=2.32.0'}, diff --git a/test/meson.build b/test/meson.build index 599a894e1..715b6b345 100644 --- a/test/meson.build +++ b/test/meson.build @@ -9,6 +9,7 @@ pwtest_deps = [ pipewire_dep, mathlib, dl_lib, + cap_lib, ] pwtest_c_args = [ diff --git a/test/pwtest.c b/test/pwtest.c index 01553c6d5..b9f6d19bc 100644 --- a/test/pwtest.c +++ b/test/pwtest.c @@ -37,6 +37,9 @@ #include #include #include +#if HAVE_LIBCAP +#include +#endif #include #include #include @@ -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; }