a19bc6
From 9576fa3ecf91fd4703e2180ac080fd975292730f Mon Sep 17 00:00:00 2001
a19bc6
From: hese10 <heikki.kemppainen@nokia.com>
a19bc6
Date: Wed, 12 Oct 2016 19:40:28 +0300
a19bc6
Subject: [PATCH] Avoid forever loop for journalctl --list-boots command
a19bc6
 (#4278)
a19bc6
a19bc6
When date is changed in system to future and normal user logs to new
a19bc6
journal file, and then date is changed back to present time, the
a19bc6
"journalctl --list-boot" command goes to forever loop. This commit tries
a19bc6
to fix this problem by checking first the boot id list if the found boot
a19bc6
id was already in that list. If it is found, then stopping the boot id
a19bc6
find loop.
a19bc6
a19bc6
(cherry picked from commit ec02a6c90a5d8b234db534ce3f8f1901f8532057)
a19bc6
a19bc6
Conflicts:
a19bc6
	src/journal/journalctl.c
a19bc6
Related: #1294516
a19bc6
---
a19bc6
 src/journal/journalctl.c | 9 ++++++++-
a19bc6
 1 file changed, 8 insertions(+), 1 deletion(-)
a19bc6
a19bc6
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
Pablo Greco 48fc63
index 723854a2e9..c771cff8b8 100644
a19bc6
--- a/src/journal/journalctl.c
a19bc6
+++ b/src/journal/journalctl.c
a19bc6
@@ -1039,7 +1039,7 @@ static int get_boots(
a19bc6
 
a19bc6
         bool skip_once;
a19bc6
         int r, count = 0;
a19bc6
-        BootId *head = NULL, *tail = NULL;
a19bc6
+        BootId *head = NULL, *tail = NULL, *id;
a19bc6
         const bool advance_older = query_ref_boot && ref_boot_offset <= 0;
a19bc6
         sd_id128_t previous_boot_id;
a19bc6
 
a19bc6
@@ -1121,6 +1121,13 @@ static int get_boots(
a19bc6
                                 break;
a19bc6
                         }
a19bc6
                 } else {
a19bc6
+                        LIST_FOREACH(boot_list, id, head) {
a19bc6
+                                if (sd_id128_equal(id->id, current->id)) {
a19bc6
+                                        /* boot id already stored, something wrong with the journal files */
a19bc6
+                                        /* exiting as otherwise this problem would cause forever loop */
a19bc6
+                                        goto finish;
a19bc6
+                                }
a19bc6
+                        }
a19bc6
                         LIST_INSERT_AFTER(boot_list, head, tail, current);
a19bc6
                         tail = current;
a19bc6
                         current = NULL;