summaryrefslogtreecommitdiff
path: root/src/libsystemd
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2023-05-07 00:16:30 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2023-05-07 00:26:49 +0900
commite562f131585fe6ae32b1f035ba48c1548d695259 (patch)
tree6f2af7cd4eab1fc4f907092873335caa95b1e968 /src/libsystemd
parent03fdf957140b3e15a669c4a7bd6c94aaf63b4012 (diff)
downloadsystemd-e562f131585fe6ae32b1f035ba48c1548d695259.tar.gz
sd-journal: re-read entry array object
`test_object()` may call `journal_file_move_to_object()` and thus the `array` object may be invalidated.
Diffstat (limited to 'src/libsystemd')
-rw-r--r--src/libsystemd/sd-journal/journal-file.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/libsystemd/sd-journal/journal-file.c b/src/libsystemd/sd-journal/journal-file.c
index fb4b67c138..f594b3eecb 100644
--- a/src/libsystemd/sd-journal/journal-file.c
+++ b/src/libsystemd/sd-journal/journal-file.c
@@ -2975,8 +2975,16 @@ found:
if (subtract_one && t == 0 && i == 0)
return 0;
+ r = journal_file_move_to_object(f, OBJECT_ENTRY_ARRAY, a, &array);
+ if (r < 0)
+ return r;
+
+ p = journal_file_entry_array_item(f, array, 0);
+ if (p <= 0)
+ return -EBADMSG;
+
/* Let's cache this item for the next invocation */
- chain_cache_put(f->chain_cache, ci, first, a, journal_file_entry_array_item(f, array, 0), t, subtract_one ? (i > 0 ? i-1 : UINT64_MAX) : i);
+ chain_cache_put(f->chain_cache, ci, first, a, p, t, subtract_one ? (i > 0 ? i-1 : UINT64_MAX) : i);
if (subtract_one && i == 0)
p = last_p;