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