From 7b358016472eb4278cb2363d17006ce216a2b4e7 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 15 Mar 2023 00:24:37 +0300 Subject: [PATCH] Fix possible bad realloc in disk_tool_meta for non-standard metadata block sizes --- src/disk_tool_meta.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/disk_tool_meta.cpp b/src/disk_tool_meta.cpp index ed75164d..7f3a60b6 100644 --- a/src/disk_tool_meta.cpp +++ b/src/disk_tool_meta.cpp @@ -26,7 +26,7 @@ int disk_tool_t::process_meta(std::function buf_size = dsk.meta_len; void *data = memalign_or_die(MEM_ALIGNMENT, buf_size); lseek64(dsk.meta_fd, dsk.meta_offset, 0); - read_blocking(dsk.meta_fd, data, buf_size); + read_blocking(dsk.meta_fd, data, dsk.meta_block_size); // Check superblock blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)data; if (hdr->zero == 0 && @@ -41,8 +41,11 @@ int disk_tool_t::process_meta(std::function if (buf_size % dsk.meta_block_size) { buf_size = 8*dsk.meta_block_size; + void *new_data = memalign_or_die(MEM_ALIGNMENT, buf_size); + memcpy(new_data, data, dsk.meta_block_size); free(data); - data = memalign_or_die(MEM_ALIGNMENT, buf_size); + data = new_data; + hdr = (blockstore_meta_header_v1_t *)data; } } dsk.bitmap_granularity = hdr->bitmap_granularity;