summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhese10 <heikki.kemppainen@nokia.com>2016-10-12 19:40:28 +0300
committerLennart Poettering <lennart@poettering.net>2016-10-12 18:40:28 +0200
commitec02a6c90a5d8b234db534ce3f8f1901f8532057 (patch)
tree7e63c92e175661bbe3bf5ba82537535d53971d29 /src
parent63b0a24b5639d4eade5e85641dfd660fbc974322 (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')
-rw-r--r--src/journal/journalctl.c9
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;