From 84e1819ec104a168f7904134b6212669133c955f 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) --- src/libsystemd/sd-journal/sd-journal.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/libsystemd/sd-journal/sd-journal.c b/src/libsystemd/sd-journal/sd-journal.c index c90b4c926e..ffc7af4087 100644 --- a/src/libsystemd/sd-journal/sd-journal.c +++ b/src/libsystemd/sd-journal/sd-journal.c @@ -2835,24 +2835,32 @@ 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) { 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) { 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