From 83ca08245b0117e40298c77ee888c03213966081 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sat, 31 Mar 2018 13:22:25 +0200 Subject: [PATCH] checker: Check metadata size and blob sizes --- internal/checker/checker.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 0b645caa1..432bfa742 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -569,12 +569,24 @@ func (c *Checker) checkTree(id restic.ID, tree *restic.Tree) (errs []error) { errs = append(errs, Error{TreeID: id, Err: errors.Errorf("file %q has nil blob list", node.Name)}) } + var size uint64 for b, blobID := range node.Content { if blobID.IsNull() { errs = append(errs, Error{TreeID: id, Err: errors.Errorf("file %q blob %d has null ID", node.Name, b)}) continue } blobs = append(blobs, blobID) + blobSize, found := c.repo.LookupBlobSize(blobID, restic.DataBlob) + if !found { + errs = append(errs, Error{TreeID: id, Err: errors.Errorf("file %q blob %d size could not be found", node.Name, b)}) + } + size += uint64(blobSize) + } + if size != node.Size { + errs = append(errs, Error{ + TreeID: id, + Err: errors.Errorf("file %q: metadata size (%v) and sum of blob sizes (%v) do not match", node.Name, node.Size, size), + }) } case "dir": if node.Subtree == nil {