logs-show: flush matches before and after finding boots
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 26 Apr 2024 03:10:39 +0000 (12:10 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 10 May 2024 02:43:57 +0000 (11:43 +0900)
Otherwise, if several matches already set, then the first seek to head
or tail may move the cursor to an invalid place, hence they provide
wrong ID(s). Also, reading journal after calling these function may
provide unexpected data.

Currently, the caller does not install any matches before calling the
functions, and does not read any journal entry after journal_get_boots()
succeeds or journal_find_boot_by_offset() succeeds with 0. Hence, this
should not change any behavior. Just for safety.

src/shared/logs-show.c

index 5bce1c34fb4c3cc42f9b0c18fafd7f0c40807b69..be797afdf6c52e4355a1bb41f03a4bbc245d6349 100644 (file)
@@ -1790,6 +1790,7 @@ static int discover_next_boot(
                 if (r < 0)
                         return r;
                 if (r == 0) {
+                        sd_journal_flush_matches(j);
                         *ret = (BootId) {};
                         return 0; /* End of journal, yay. */
                 }
@@ -1947,6 +1948,8 @@ int journal_find_boot_by_offset(sd_journal *j, int offset, sd_id128_t *ret) {
          * (chronological) first boot in the journal. */
         advance_older = offset <= 0;
 
+        sd_journal_flush_matches(j);
+
         if (advance_older)
                 r = sd_journal_seek_tail(j); /* seek to newest */
         else
@@ -1992,6 +1995,8 @@ int journal_get_boots(sd_journal *j, BootId **ret_boots, size_t *ret_n_boots) {
         assert(ret_boots);
         assert(ret_n_boots);
 
+        sd_journal_flush_matches(j);
+
         r = sd_journal_seek_head(j); /* seek to oldest */
         if (r < 0)
                 return r;