diff --git a/docs/reference/glib/glib-sections.txt.in b/docs/reference/glib/glib-sections.txt.in index 103c688ac..5258544a3 100644 --- a/docs/reference/glib/glib-sections.txt.in +++ b/docs/reference/glib/glib-sections.txt.in @@ -3359,6 +3359,7 @@ g_test_trap_assert_stdout_unmatched g_test_trap_assert_stderr g_test_trap_assert_stderr_unmatched g_test_trap_fork +g_test_disable_crash_reporting g_test_rand_bit g_test_rand_int diff --git a/glib/gtestutils.c b/glib/gtestutils.c index 0b7e68361..70cdc20e0 100644 --- a/glib/gtestutils.c +++ b/glib/gtestutils.c @@ -34,6 +34,9 @@ #include #include #include +#ifdef HAVE_SYS_PRCTL_H +#include +#endif #ifdef HAVE_SYS_RESOURCE_H #include #endif @@ -1302,6 +1305,33 @@ g_test_log (GTestLogType lbit, } } +/** + * g_test_disable_crash_reporting: + * + * Attempt to disable system crash reporting infrastructure. + * + * This function should be called before exercising code paths that are + * expected or intended to crash, to avoid wasting resources in system-wide + * crash collection infrastructure such as systemd-coredump or abrt. + * + * Since: 2.78 + */ +void +g_test_disable_crash_reporting (void) +{ +#ifdef HAVE_SYS_RESOURCE_H + struct rlimit limit = { 0, 0 }; + + (void) setrlimit (RLIMIT_CORE, &limit); +#endif + +#if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE) + /* On Linux, RLIMIT_CORE = 0 is ignored if core dumps are + * configured to be written to a pipe, but PR_SET_DUMPABLE is not. */ + (void) prctl (PR_SET_DUMPABLE, 0, 0, 0, 0); +#endif +} + /* We intentionally parse the command line without GOptionContext * because otherwise you would never be able to test it. */ @@ -1376,12 +1406,8 @@ parse_args (gint *argc_p, * tests spawn a *lot* of them. Avoid spamming system crash * collection programs such as systemd-coredump and abrt. */ -#ifdef HAVE_SYS_RESOURCE_H - { - struct rlimit limit = { 0, 0 }; - (void) setrlimit (RLIMIT_CORE, &limit); - } -#endif + g_test_disable_crash_reporting (); + argv[i] = NULL; /* Force non-TAP output when spawning a subprocess, since people often @@ -3980,12 +4006,7 @@ g_test_trap_fork (guint64 usec_timeout, * tests spawn a *lot* of them. Avoid spamming system crash * collection programs such as systemd-coredump and abrt. */ -#ifdef HAVE_SYS_RESOURCE_H - { - struct rlimit limit = { 0, 0 }; - (void) setrlimit (RLIMIT_CORE, &limit); - } -#endif + g_test_disable_crash_reporting (); return TRUE; } diff --git a/glib/gtestutils.h b/glib/gtestutils.h index 9406ff0d8..688f2eae7 100644 --- a/glib/gtestutils.h +++ b/glib/gtestutils.h @@ -407,6 +407,8 @@ GLIB_AVAILABLE_IN_2_38 gboolean g_test_failed (void); GLIB_AVAILABLE_IN_2_38 void g_test_set_nonfatal_assertions (void); +GLIB_AVAILABLE_IN_2_78 +void g_test_disable_crash_reporting (void); /** * g_test_add: diff --git a/glib/tests/assert-msg-test.c b/glib/tests/assert-msg-test.c index b46496635..7f450d226 100644 --- a/glib/tests/assert-msg-test.c +++ b/glib/tests/assert-msg-test.c @@ -19,20 +19,14 @@ */ #include "config.h" -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif #include int main (int argc, char **argv) { -#ifdef HAVE_SYS_RESOURCE_H /* We expect this test to abort, so try to avoid that creating a coredump */ - struct rlimit limit = { 0, 0 }; - (void) setrlimit (RLIMIT_CORE, &limit); -#endif + g_test_disable_crash_reporting (); g_assert (42 < 0); return 0; diff --git a/glib/tests/messages-low-memory.c b/glib/tests/messages-low-memory.c index ecb507024..479143723 100644 --- a/glib/tests/messages-low-memory.c +++ b/glib/tests/messages-low-memory.c @@ -23,9 +23,6 @@ #include "config.h" #include -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif #include static gboolean malloc_eom = FALSE; @@ -59,11 +56,8 @@ int main (int argc, char *argv[]) { -#ifdef HAVE_SYS_RESOURCE_H /* We expect this test to abort, so try to avoid that creating a coredump */ - struct rlimit limit = { 0, 0 }; - (void) setrlimit (RLIMIT_CORE, &limit); -#endif + g_test_disable_crash_reporting (); g_setenv ("LC_ALL", "C", TRUE); diff --git a/meson.build b/meson.build index 796ab6872..178bf0bbb 100644 --- a/meson.build +++ b/meson.build @@ -381,6 +381,7 @@ headers = [ 'sys/mnttab.h', 'sys/mount.h', 'sys/param.h', + 'sys/prctl.h', 'sys/resource.h', 'sys/select.h', 'sys/statfs.h', @@ -695,6 +696,11 @@ if glib_conf.has('HAVE_SYS_STATFS_H') or glib_conf.has('HAVE_SYS_MOUNT_H') else have_func_statfs = false endif +if glib_conf.has('HAVE_SYS_PRCTL_H') + functions += ['prctl'] +else + have_func_prctl = false +endif if host_system == 'windows' iphlpapi_dep = cc.find_library('iphlpapi')