diff --git a/man/coredump.conf.xml b/man/coredump.conf.xml index 048bbc3637..49debb219a 100644 --- a/man/coredump.conf.xml +++ b/man/coredump.conf.xml @@ -74,7 +74,7 @@ Controls where to store cores. One of none, external, and journal. When - none, the core dumps will be logged (including the backtrace if + none, the core dumps may be logged (including the backtrace if possible), but not stored permanently. When external (the default), cores will be stored in /var/lib/systemd/coredump/. When journal, cores will be stored in the journal and rotated @@ -101,8 +101,12 @@ The maximum size in bytes of a core which will be processed. Core dumps exceeding this size - will be logged, but the backtrace will not be generated - and the core will not be stored. + may be stored, but the backtrace will not be generated. + + + Setting Storage=none and ProcessSizeMax=0 + disables all coredump handling except for a log entry. + diff --git a/man/systemd-coredump.xml b/man/systemd-coredump.xml index 6c3078143f..6fba19c223 100644 --- a/man/systemd-coredump.xml +++ b/man/systemd-coredump.xml @@ -128,6 +128,16 @@ core dumps and files can be set in files /etc/systemd/coredump.conf and snippets mentioned above. In addition the storage time of core dump files is restricted by systemd-tmpfiles, corresponding settings are by default in /usr/lib/tmpfiles.d/systemd.conf. + + + Disabling coredump processing + + To disable potentially resource-intensive processing by systemd-coredump, + set Storage=none +ProcessSizeMax=0 in + coredump.conf5. + + diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c index 423a1c21a4..c1f396b1ac 100644 --- a/src/coredump/coredump.c +++ b/src/coredump/coredump.c @@ -141,7 +141,12 @@ static int parse_config(void) { } static inline uint64_t storage_size_max(void) { - return arg_storage == COREDUMP_STORAGE_EXTERNAL ? arg_external_size_max : arg_journal_size_max; + if (arg_storage == COREDUMP_STORAGE_EXTERNAL) + return arg_external_size_max; + if (arg_storage == COREDUMP_STORAGE_JOURNAL) + return arg_journal_size_max; + assert(arg_storage == COREDUMP_STORAGE_NONE); + return 0; } static int fix_acl(int fd, uid_t uid) { @@ -323,7 +328,7 @@ static int save_external_coredump( _cleanup_free_ char *fn = NULL, *tmp = NULL; _cleanup_close_ int fd = -1; - uint64_t rlimit, max_size; + uint64_t rlimit, process_limit, max_size; struct stat st; uid_t uid; int r; @@ -350,8 +355,14 @@ static int save_external_coredump( return -EBADSLT; } + process_limit = MAX(arg_process_size_max, storage_size_max()); + if (process_limit == 0) { + log_debug("Limits for coredump processing and storage are both 0, not dumping core."); + return -EBADSLT; + } + /* Never store more than the process configured, or than we actually shall keep or process */ - max_size = MIN(rlimit, MAX(arg_process_size_max, storage_size_max())); + max_size = MIN(rlimit, process_limit); r = make_filename(context, &fn); if (r < 0)