diff options
| -rw-r--r-- | src/coredump/coredump.c | 26 | 
1 files changed, 19 insertions, 7 deletions
| diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c index e38cc59a36..855f0e9330 100644 --- a/src/coredump/coredump.c +++ b/src/coredump/coredump.c @@ -324,7 +324,8 @@ static int save_external_coredump(                  char **ret_filename,                  int *ret_node_fd,                  int *ret_data_fd, -                uint64_t *ret_size) { +                uint64_t *ret_size, +                bool *truncated) {          _cleanup_free_ char *fn = NULL, *tmp = NULL;          _cleanup_close_ int fd = -1; @@ -372,7 +373,9 @@ static int save_external_coredump(          if (r < 0) {                  log_error_errno(r, "Cannot store coredump of %s (%s): %m", context[CONTEXT_PID], context[CONTEXT_COMM]);                  goto fail; -        } else if (r == 1) +        } +        *truncated = r == 1; +        if (*truncated)                  log_struct(LOG_INFO,                             LOG_MESSAGE("Core file was truncated to %zu bytes.", max_size),                             "SIZE_LIMIT=%zu", max_size, @@ -691,6 +694,8 @@ static int change_uid_gid(const char *context[]) {          return drop_privileges(uid, gid, 0);  } +#define SUBMIT_COREDUMP_FIELDS 4 +  static int submit_coredump(                  const char *context[_CONTEXT_MAX],                  struct iovec *iovec, @@ -701,18 +706,20 @@ static int submit_coredump(          _cleanup_close_ int coredump_fd = -1, coredump_node_fd = -1;          _cleanup_free_ char *core_message = NULL, *filename = NULL, *coredump_data = NULL;          uint64_t coredump_size = UINT64_MAX; +        bool truncated = false;          int r;          assert(context);          assert(iovec); -        assert(n_iovec_allocated >= n_iovec + 3); +        assert(n_iovec_allocated >= n_iovec + SUBMIT_COREDUMP_FIELDS);          assert(input_fd >= 0);          /* Vacuum before we write anything again */          (void) coredump_vacuum(-1, arg_keep_free, arg_max_use);          /* Always stream the coredump to disk, if that's possible */ -        r = save_external_coredump(context, input_fd, &filename, &coredump_node_fd, &coredump_fd, &coredump_size); +        r = save_external_coredump(context, input_fd, +                                   &filename, &coredump_node_fd, &coredump_fd, &coredump_size, &truncated);          if (r < 0)                  /* Skip whole core dumping part */                  goto log; @@ -770,6 +777,9 @@ log:          if (core_message)                  IOVEC_SET_STRING(iovec[n_iovec++], core_message); +        if (truncated) +                IOVEC_SET_STRING(iovec[n_iovec++], "COREDUMP_TRUNCATED=yes"); +          /* Optionally store the entire coredump in the journal */          if (arg_storage == COREDUMP_STORAGE_JOURNAL) {                  if (coredump_size <= arg_journal_size_max) { @@ -861,7 +871,7 @@ static int process_socket(int fd) {                  ssize_t n;                  ssize_t l; -                if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + 3)) { +                if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + SUBMIT_COREDUMP_FIELDS)) {                          r = log_oom();                          goto finish;                  } @@ -925,7 +935,7 @@ static int process_socket(int fd) {                  n_iovec++;          } -        if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + 3)) { +        if (!GREEDY_REALLOC(iovec, n_allocated, n_iovec + SUBMIT_COREDUMP_FIELDS)) {                  r = log_oom();                  goto finish;          } @@ -1027,6 +1037,7 @@ static int process_special_crash(const char *context[], int input_fd) {          _cleanup_close_ int coredump_fd = -1, coredump_node_fd = -1;          _cleanup_free_ char *filename = NULL;          uint64_t coredump_size; +        bool truncated;          int r;          assert(context); @@ -1037,7 +1048,8 @@ static int process_special_crash(const char *context[], int input_fd) {          if (arg_storage != COREDUMP_STORAGE_NONE)                  arg_storage = COREDUMP_STORAGE_EXTERNAL; -        r = save_external_coredump(context, input_fd, &filename, &coredump_node_fd, &coredump_fd, &coredump_size); +        r = save_external_coredump(context, input_fd, +                                   &filename, &coredump_node_fd, &coredump_fd, &coredump_size, &truncated);          if (r < 0)                  return r; | 
