]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
journal: Handle partially read HashItem's when punching holes
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Mon, 20 Dec 2021 13:55:02 +0000 (14:55 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Dec 2021 17:29:57 +0000 (02:29 +0900)
src/journal/journald-file.c

index 503900d5bc2721115db99c780730a764bbaaf45f..35ca305384ecbf99f99ef95f2ec36b7f76cbf36e 100644 (file)
@@ -81,7 +81,7 @@ static int journald_file_entry_array_punch_hole(JournalFile *f, uint64_t p, uint
 static int journald_file_punch_holes(JournalFile *f) {
         HashItem items[PAYLOAD_BUFFER_SIZE / sizeof(HashItem)];
         uint64_t p, sz;
-        ssize_t n;
+        ssize_t n = SSIZE_MAX;
         int r;
 
         r = journald_file_entry_array_punch_hole(
@@ -92,11 +92,14 @@ static int journald_file_punch_holes(JournalFile *f) {
         p = le64toh(f->header->data_hash_table_offset);
         sz = le64toh(f->header->data_hash_table_size);
 
-        for (uint64_t i = p; i < p + sz; i += n) {
+        for (uint64_t i = p; i < p + sz && n > 0; i += n) {
                 n = pread(f->fd, items, MIN(sizeof(items), p + sz - i), i);
                 if (n < 0)
                         return n;
 
+                /* Let's ignore any partial hash items by rounding down to the nearest multiple of HashItem. */
+                n -= n % sizeof(HashItem);
+
                 for (size_t j = 0; j < (size_t) n / sizeof(HashItem); j++) {
                         Object o;