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)