From 2a14dd4f473165917a6894ce5465890bd5ff8ee5 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 11 Oct 2022 09:38:42 -0700 Subject: [PATCH] Autotest/Unix: request zero-sized core dumps for crashing code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unix systems have got crash loggers in the past 15-20 years, notably macOS and Linux (abrtd, systemd-coredumpd, etc.). By setting the core dump limit to zero, those tools should be mostly inhibited from running and thus not interfere with the parent process' timeouts. Even for systems without core dump loggers, disabling the writing of a core dump to the filesystem should also help. Change-Id: I12a088d1ae424825abd3fffd171d112d0671effe Reviewed-by: MÃ¥rten Nordheim (cherry picked from commit c849c48d19cc0b086f98688d760fa6e008adc50e) Reviewed-by: Qt Cherry-pick Bot --- .../io/qprocess/testProcessCrash/main.cpp | 16 ++++++++++++++++ .../socket/qtcpserver/crashingServer/main.cpp | 10 +++++++++- .../testlib/selftests/crashes/tst_crashes.cpp | 8 ++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp b/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp index 1441c8ed0c8..ddf0ef0ad79 100644 --- a/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp +++ b/tests/auto/corelib/io/qprocess/testProcessCrash/main.cpp @@ -2,6 +2,22 @@ // Copyright (C) 2020 Intel Corporation. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +#if __has_include() +# include +# if defined(RLIMIT_CORE) +static bool disableCoreDumps() +{ + // Unix: set our core dump limit to zero to request no dialogs. + if (struct rlimit rlim; getrlimit(RLIMIT_CORE, &rlim) == 0) { + rlim.rlim_cur = 0; + setrlimit(RLIMIT_CORE, &rlim); + } + return true; +} +static bool disabledCoreDumps = disableCoreDumps(); +# endif // RLIMIT_CORE +#endif // + void crashFallback(volatile int *ptr = nullptr) { *ptr = 0; diff --git a/tests/auto/network/socket/qtcpserver/crashingServer/main.cpp b/tests/auto/network/socket/qtcpserver/crashingServer/main.cpp index 08f234aa3e0..1fe9f78a329 100644 --- a/tests/auto/network/socket/qtcpserver/crashingServer/main.cpp +++ b/tests/auto/network/socket/qtcpserver/crashingServer/main.cpp @@ -8,15 +8,23 @@ # include #endif #ifdef Q_OS_UNIX +# include # include #endif int main(int argc, char *argv[]) { - // Windows: Suppress crash notification dialog. #if defined(Q_OS_WIN) && defined(Q_CC_MSVC) + // Windows: Suppress crash notification dialog. _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); +#elif defined(RLIMIT_CORE) + // Unix: set our core dump limit to zero to request no dialogs. + if (struct rlimit rlim; getrlimit(RLIMIT_CORE, &rlim) == 0) { + rlim.rlim_cur = 0; + setrlimit(RLIMIT_CORE, &rlim); + } #endif + QCoreApplication app(argc, argv); QTcpServer server; diff --git a/tests/auto/testlib/selftests/crashes/tst_crashes.cpp b/tests/auto/testlib/selftests/crashes/tst_crashes.cpp index abac42c7232..38ed27d331a 100644 --- a/tests/auto/testlib/selftests/crashes/tst_crashes.cpp +++ b/tests/auto/testlib/selftests/crashes/tst_crashes.cpp @@ -7,6 +7,8 @@ #ifdef Q_OS_WIN #include +#else +#include #endif class tst_Crashes: public QObject @@ -22,6 +24,12 @@ void tst_Crashes::crash() #if defined(Q_OS_WIN) //we avoid the error dialogbox to appear on windows SetErrorMode( SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); +#elif defined(RLIMIT_CORE) + // Unix: set our core dump limit to zero to request no dialogs. + if (struct rlimit rlim; getrlimit(RLIMIT_CORE, &rlim) == 0) { + rlim.rlim_cur = 0; + setrlimit(RLIMIT_CORE, &rlim); + } #endif /* We deliberately dereference an invalid but non-zero address;