From e0655e24f2635011e055758c2ec4f348bb8b3347 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 28 Oct 2020 19:24:01 -0700 Subject: [PATCH] fix: A possible crash when fi.Erasure.Distribution is empty (#10779) --- cmd/erasure-healing-common.go | 17 +++++++++++++++++ cmd/erasure-metadata.go | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cmd/erasure-healing-common.go b/cmd/erasure-healing-common.go index 2615e3599..8806646a1 100644 --- a/cmd/erasure-healing-common.go +++ b/cmd/erasure-healing-common.go @@ -167,7 +167,14 @@ func disksWithAllParts(ctx context.Context, onlineDisks []StorageAPI, partsMetad // consider the offline disks as consistent. continue } + if len(meta.Erasure.Distribution) != len(onlineDisks) { + // Erasure distribution seems to have lesser + // number of items than number of online disks. + inconsistent++ + continue + } if meta.Erasure.Distribution[i] != meta.Erasure.Index { + // Mismatch indexes with distribution order inconsistent++ } } @@ -193,6 +200,16 @@ func disksWithAllParts(ctx context.Context, onlineDisks []StorageAPI, partsMetad if !meta.IsValid() { continue } + + if len(meta.Erasure.Distribution) != len(onlineDisks) { + // Erasure distribution is not the same as onlineDisks + // attempt a fix if possible, assuming other entries + // might have the right erasure distribution. + partsMetadata[i] = FileInfo{} + dataErrs[i] = errFileCorrupt + continue + } + // Since erasure.Distribution is trustable we can fix the mismatching erasure.Index if meta.Erasure.Distribution[i] != meta.Erasure.Index { partsMetadata[i] = FileInfo{} diff --git a/cmd/erasure-metadata.go b/cmd/erasure-metadata.go index b1c595d04..386852b16 100644 --- a/cmd/erasure-metadata.go +++ b/cmd/erasure-metadata.go @@ -90,9 +90,12 @@ func (fi FileInfo) IsValid() bool { } dataBlocks := fi.Erasure.DataBlocks parityBlocks := fi.Erasure.ParityBlocks + correctIndexes := (fi.Erasure.Index > 0 && + fi.Erasure.Index <= dataBlocks+parityBlocks && + len(fi.Erasure.Distribution) == (dataBlocks+parityBlocks)) return ((dataBlocks >= parityBlocks) && (dataBlocks != 0) && (parityBlocks != 0) && - (fi.Erasure.Index > 0 && fi.Erasure.Distribution != nil)) + correctIndexes) } // ToObjectInfo - Converts metadata to object info.