From e74c0a9d8047b3acce7704451e99a571d5038328 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Sun, 28 Jan 2018 01:37:20 -0500 Subject: [PATCH] scan: fix length mismatch exception for prealloc extents at EOF Prealloc extent sizes were taken from the Extent object and did not take the file size into account. If a file with a non-4K-aligned size is preallocated, the resulting dedup fails with an exception because the size of both ranges of the BeesRangePair do not match. Limit the size of the replacement hole extent to not extend past the end of the file. Signed-off-by: Zygo Blaxell --- src/bees-context.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bees-context.cc b/src/bees-context.cc index 153d7b5..0ef4dcd 100644 --- a/src/bees-context.cc +++ b/src/bees-context.cc @@ -298,7 +298,9 @@ BeesContext::scan_one_extent(const BeesFileRange &bfr, const Extent &e) // Prealloc is all zero and we replace it with a hole. // No special handling is required here. Nuke it and move on. BEESLOGINFO("prealloc extent " << e); - BeesFileRange prealloc_bfr(m_ctx->tmpfile()->make_hole(e.size())); + // Must not extend past EOF + auto extent_size = min(e.end(), bfr.file_size()) - e.begin(); + BeesFileRange prealloc_bfr(m_ctx->tmpfile()->make_hole(extent_size)); BeesRangePair brp(prealloc_bfr, bfr); // Raw dedup here - nothing else to do with this extent, nothing to merge with if (m_ctx->dedup(brp)) {