From: msizanoen1 Date: Sat, 8 Oct 2022 12:41:18 +0000 (+0700) Subject: journald: harden against forward clock jumps before unclean shutdown X-Git-Tag: v252-rc2~21^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=383d9155a2b5be10e2a14909c234a99e0e0dbba7;p=thirdparty%2Fsystemd.git journald: harden against forward clock jumps before unclean shutdown Try harder to inherit the sequence number and ID from the old journal file before rotating it away. This helps the libsystemd journal file selection code make better decisions even in the face of massive incorrect forward clock jumps prior to an unclean shutdown. --- diff --git a/src/journal/managed-journal-file.c b/src/journal/managed-journal-file.c index c8522126f37..6164361d751 100644 --- a/src/journal/managed-journal-file.c +++ b/src/journal/managed-journal-file.c @@ -510,6 +510,7 @@ int managed_journal_file_open_reliably( ManagedJournalFile *template, ManagedJournalFile **ret) { + _cleanup_(managed_journal_file_closep) ManagedJournalFile *old_file = NULL; int r; r = managed_journal_file_open(-1, fname, open_flags, file_flags, mode, compress_threshold_bytes, metrics, @@ -538,6 +539,19 @@ int managed_journal_file_open_reliably( /* The file is corrupted. Rotate it away and try it again (but only once) */ log_warning_errno(r, "File %s corrupted or uncleanly shut down, renaming and replacing.", fname); + if (!template) { + /* The file is corrupted and no template is specified. Try opening it read-only as the + * template before rotating to inherit its sequence number and ID. */ + r = managed_journal_file_open(-1, fname, + (open_flags & ~(O_ACCMODE|O_CREAT|O_EXCL)) | O_RDONLY, + file_flags, 0, compress_threshold_bytes, NULL, + mmap_cache, deferred_closes, NULL, &old_file); + if (r < 0) + log_debug_errno(r, "Failed to continue sequence from file %s, ignoring: %m", fname); + else + template = old_file; + } + r = journal_file_dispose(AT_FDCWD, fname); if (r < 0) return r;