lib/protocol: Include WeakHash in BlocksHash (#6799)

This commit is contained in:
Simon Frei 2020-06-29 09:33:07 +02:00 committed by GitHub
parent 9d4a700829
commit ebbe1abe28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 4 deletions

View File

@ -276,9 +276,11 @@ func PermsEqual(a, b uint32) bool {
// BlocksEqual returns true when the two files have identical block lists.
func (f FileInfo) BlocksEqual(other FileInfo) bool {
// If both sides have blocks hashes then we can just compare those.
if len(f.BlocksHash) > 0 && len(other.BlocksHash) > 0 {
return bytes.Equal(f.BlocksHash, other.BlocksHash)
// If both sides have blocks hashes and they match, we are good. If they
// don't match still check individual block hashes to catch differences
// in weak hashes only (e.g. after switching weak hash algo).
if len(f.BlocksHash) > 0 && len(other.BlocksHash) > 0 && bytes.Equal(f.BlocksHash, other.BlocksHash) {
return true
}
// Actually compare the block lists in full.
@ -382,6 +384,7 @@ func BlocksHash(bs []BlockInfo) []byte {
h := sha256.New()
for _, b := range bs {
_, _ = h.Write(b.Hash)
_ = binary.Write(h, binary.BigEndian, b.WeakHash)
}
return h.Sum(nil)
}

View File

@ -887,7 +887,8 @@ func TestBlocksEqual(t *testing.T) {
{blocksOne, nil, blocksOne, nil, true}, // blocks compared
{blocksOne, nil, blocksTwo, nil, false}, // blocks compared
{blocksOne, hashOne, blocksTwo, hashOne, true}, // hashes equal, blocks not looked at
{blocksOne, hashOne, blocksOne, hashTwo, false}, // hashes different, blocks not looked at
{blocksOne, hashOne, blocksOne, hashTwo, true}, // hashes different, blocks compared
{blocksOne, hashOne, blocksTwo, hashTwo, false}, // hashes different, blocks compared
{blocksOne, hashOne, nil, nil, false}, // blocks is different from no blocks
{blocksOne, nil, nil, nil, false}, // blocks is different from no blocks
{nil, hashOne, nil, nil, true}, // nil blocks are equal, even of one side has a hash