]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journal-authenticate: check overflow
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 25 Jun 2026 16:23:46 +0000 (01:23 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 27 Jun 2026 14:57:55 +0000 (23:57 +0900)
src/journal/journald.c
src/libsystemd/sd-journal/journal-authenticate.c
src/libsystemd/sd-journal/journal-authenticate.h

index a06752d32e578f97ffd2c27462e188b5701f4be4..9ab5fdfdedb43cf0dd1e62edb577533b013b5254 100644 (file)
@@ -114,7 +114,7 @@ static int run(int argc, char *argv[]) {
                 if (m->system_journal) {
                         usec_t u;
 
-                        if (journal_file_next_evolve_usec(m->system_journal, &u))
+                        if (journal_file_next_evolve_usec(m->system_journal, &u) >= 0)
                                 t = MIN(t, usec_sub_unsigned(u, n));
                 }
 #endif
index 0acfb3260e827eaab3bdc19fe20f7e9356ccb334..46c76926c35d8a123c7e6916324e2d06f0110d6a 100644 (file)
@@ -164,20 +164,34 @@ int journal_file_parse_verification_key(JournalFile *f, const char *key) {
         return 0;
 }
 
-bool journal_file_next_evolve_usec(JournalFile *f, usec_t *u) {
-        uint64_t epoch;
+static int journal_auth_epoch_to_realtime_usec(JournalFile *f, uint64_t epoch, usec_t *ret_start, usec_t *ret_end) {
+        assert(f);
+        assert(f->fss_start_usec > 0);
+        assert(f->fss_interval_usec > 0);
+
+        uint64_t start, end;
+        if (!MUL_SAFE(&start, epoch, f->fss_interval_usec) ||
+            !INC_SAFE(&start, f->fss_start_usec) ||
+            !ADD_SAFE(&end, start, f->fss_interval_usec))
+                return -ERANGE;
+
+        if (ret_start)
+                *ret_start = start;
+        if (ret_end)
+                *ret_end = end;
 
+        return 0;
+}
+
+int journal_file_next_evolve_usec(JournalFile *f, usec_t *ret) {
         assert(f);
-        assert(u);
 
         if (!JOURNAL_HEADER_SEALED(f->header))
-                return false;
-
-        epoch = FSPRG_GetEpoch(f->fsprg_state.iov_base);
+                return -EOPNOTSUPP;
 
-        *u = (usec_t) (f->fss_start_usec + f->fss_interval_usec * epoch + f->fss_interval_usec);
+        uint64_t epoch = FSPRG_GetEpoch(f->fsprg_state.iov_base);
 
-        return true;
+        return journal_auth_epoch_to_realtime_usec(f, epoch, /* ret_start= */ NULL, ret);
 }
 
 int journal_file_fsprg_seek(JournalFile *f, uint64_t goal) {
index e18fe7faf9cc0b5fed01b6028a906f0d4e514ccf..0dd2ef3bf621ac1fddf7b58e88b7106ee57f80f6 100644 (file)
@@ -18,4 +18,4 @@ int journal_file_parse_verification_key(JournalFile *f, const char *key);
 
 int journal_file_fsprg_seek(JournalFile *f, uint64_t goal);
 
-bool journal_file_next_evolve_usec(JournalFile *f, usec_t *u);
+int journal_file_next_evolve_usec(JournalFile *f, usec_t *ret);