From 12fa360daa33e1119e61be4cf99e683481c30515 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 8 Jun 2021 22:14:40 +0200 Subject: [PATCH] journal: add some careful overflow checking (cherry picked from commit d8671b1c6f036ce270b9631973314e7de24e74b1) (cherry picked from commit 84e1819ec104a168f7904134b6212669133c955f) (cherry picked from commit 03af9b1476ff56c67cb84d14927f1ac7b1a534e3) --- src/journal/sd-journal.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 60acd883f2..40c6d0b9d6 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -2856,25 +2856,33 @@ void journal_print_header(sd_journal *j) { } } -_public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) { +_public_ int sd_journal_get_usage(sd_journal *j, uint64_t *ret) { Iterator i; JournalFile *f; uint64_t sum = 0; assert_return(j, -EINVAL); assert_return(!journal_pid_changed(j), -ECHILD); - assert_return(bytes, -EINVAL); + assert_return(ret, -EINVAL); ORDERED_HASHMAP_FOREACH(f, j->files, i) { struct stat st; + uint64_t b; if (fstat(f->fd, &st) < 0) return -errno; - sum += (uint64_t) st.st_blocks * 512ULL; + b = (uint64_t) st.st_blocks; + if (b > UINT64_MAX / 512) + return -EOVERFLOW; + b *= 512; + + if (sum > UINT64_MAX - b) + return -EOVERFLOW; + sum += b; } - *bytes = sum; + *ret = sum; return 0; } -- 2.25.1