journal-authenticate: check overflow
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
epoch = FSPRG_GetEpoch(f->fsprg_state.iov_base);
|
||||
uint64_t epoch = FSPRG_GetEpoch(f->fsprg_state.iov_base);
|
||||
|
||||
*u = (usec_t) (f->fss_start_usec + f->fss_interval_usec * epoch + f->fss_interval_usec);
|
||||
|
||||
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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user