diff options
author | hese10 <heikki.kemppainen@nokia.com> | 2016-10-12 19:40:28 +0300 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2016-10-12 18:40:28 +0200 |
commit | ec02a6c90a5d8b234db534ce3f8f1901f8532057 (patch) | |
tree | 7e63c92e175661bbe3bf5ba82537535d53971d29 /src/journal/journalctl.c | |
parent | 63b0a24b5639d4eade5e85641dfd660fbc974322 (diff) |
Avoid forever loop for journalctl --list-boots command (#4278)
When date is changed in system to future and normal user logs to new journal file, and then date is changed back to present time, the "journalctl --list-boot" command goes to forever loop. This commit tries to fix this problem by checking first the boot id list if the found boot id was already in that list. If it is found, then stopping the boot id find loop.
Diffstat (limited to 'src/journal/journalctl.c')
-rw-r--r-- | src/journal/journalctl.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 4350925fb0..13e3b44f06 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -1112,7 +1112,7 @@ static int get_boots( bool skip_once; int r, count = 0; - BootId *head = NULL, *tail = NULL; + BootId *head = NULL, *tail = NULL, *id; const bool advance_older = boot_id && offset <= 0; sd_id128_t previous_boot_id; @@ -1203,6 +1203,13 @@ static int get_boots( break; } } else { + LIST_FOREACH(boot_list, id, head) { + if (sd_id128_equal(id->id, current->id)) { + /* boot id already stored, something wrong with the journal files */ + /* exiting as otherwise this problem would cause forever loop */ + goto finish; + } + } LIST_INSERT_AFTER(boot_list, head, tail, current); tail = current; current = NULL; |