From: Daan De Meyer Date: Mon, 7 Feb 2022 20:19:29 +0000 (+0000) Subject: journal: Improve handling of corruption during upwards entry iteration X-Git-Tag: v251-rc1~333^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F22442%2Fhead;p=thirdparty%2Fsystemd.git journal: Improve handling of corruption during upwards entry iteration If we're going upwards in the journal file during entry iteration and we can't reach the current entry due to corruption, start iterating upwards from the last reachable entry array. This is equivalent to skipping all entries in the array that can't be reached anymore. Fixes #22431 --- diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c index a2226da47be..ac8ad145eda 100644 --- a/src/libsystemd/sd-journal/journal-file.c +++ b/src/libsystemd/sd-journal/journal-file.c @@ -2224,6 +2224,24 @@ static int generic_array_get( while (a > 0) { r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &o); + if (IN_SET(r, -EBADMSG, -EADDRNOTAVAIL)) { + /* If there's corruption and we're going downwards, let's pretend we reached the + * final entry in the entry array chain. */ + + if (direction == DIRECTION_DOWN) + return 0; + + /* If there's corruption and we're going upwards, move back to the previous entry + * array and start iterating entries from there. */ + + r = bump_entry_array(f, NULL, a, first, DIRECTION_UP, &a); + if (r < 0) + return r; + + i = UINT64_MAX; + + break; + } if (r < 0) return r;