From a473278bfaa3ba2ce32dff70990625fcc19efc29 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Fri, 16 Jan 2026 19:19:18 -0800 Subject: [PATCH] Fix: Fail fast on unsupported volume versions (#8047) * Fix: Fail fast when initializing volume with Version 0 * Fix: Fail fast when loading unsupported volume version (e.g. 0 or 4) * Refactor: Use IsSupportedVersion helper function for version validation --- weed/storage/needle/volume_version.go | 4 ++++ weed/storage/volume_loading.go | 3 +++ weed/storage/volume_super_block.go | 3 +++ 3 files changed, 10 insertions(+) diff --git a/weed/storage/needle/volume_version.go b/weed/storage/needle/volume_version.go index 15d2aa2a7..f96eb3e01 100644 --- a/weed/storage/needle/volume_version.go +++ b/weed/storage/needle/volume_version.go @@ -11,3 +11,7 @@ const ( func GetCurrentVersion() Version { return Version3 } + +func IsSupportedVersion(v Version) bool { + return v >= Version1 && v <= Version3 +} diff --git a/weed/storage/volume_loading.go b/weed/storage/volume_loading.go index 65fe143bd..901b4a37a 100644 --- a/weed/storage/volume_loading.go +++ b/weed/storage/volume_loading.go @@ -106,6 +106,9 @@ func (v *Volume) load(alsoLoadIndex bool, createDatIfMissing bool, needleMapKind if alreadyHasSuperBlock { err = v.readSuperBlock() if err == nil { + if !needle.IsSupportedVersion(v.SuperBlock.Version) { + glog.Fatalf("Unsupported volume %d version %v", v.Id, v.SuperBlock.Version) + } v.volumeInfo.Version = uint32(v.SuperBlock.Version) } glog.V(2).Infof("readSuperBlock volume %d version %v", v.Id, v.SuperBlock.Version) diff --git a/weed/storage/volume_super_block.go b/weed/storage/volume_super_block.go index baf490af8..73203dccd 100644 --- a/weed/storage/volume_super_block.go +++ b/weed/storage/volume_super_block.go @@ -18,6 +18,9 @@ func (v *Volume) maybeWriteSuperBlock(ver needle.Version) error { return e } if datSize == 0 { + if !needle.IsSupportedVersion(ver) { + return fmt.Errorf("volume super block version %d is not supported", ver) + } v.SuperBlock.Version = ver _, e = v.DataBackend.WriteAt(v.SuperBlock.Bytes(), 0) if e != nil && os.IsPermission(e) {