diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2025-12-08 22:26:03 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-08 22:26:03 -0800 |
| commit | cea12ba3c4df7b54027aa550043ca347bf3f3be4 (patch) | |
| tree | a3fb78f825526f28c77f58616bb4b7f4b4fe2c50 | |
| parent | 9196696278ae1bd1203cf149f1de43317b3ccef3 (diff) | |
| download | seaweedfs-cea12ba3c4df7b54027aa550043ca347bf3f3be4.tar.xz seaweedfs-cea12ba3c4df7b54027aa550043ca347bf3f3be4.zip | |
fix: prevent makeslice panic in ReadNeedleMeta with corrupted needle (#7675)
* fix: prevent makeslice panic in ReadNeedleMeta with corrupted needle
When a needle's DataSize in the .dat file is corrupted to a very large
value, the calculation of metaSize can become negative, causing a panic
with 'makeslice: len out of range' when creating the metadata slice.
This fix adds validation to check if metaSize is negative before
creating the slice, returning a descriptive error instead of panicking.
Fixes #7475
* Update weed/storage/needle/needle_read_page.go
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
---------
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
| -rw-r--r-- | weed/storage/needle/needle_read_page.go | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/weed/storage/needle/needle_read_page.go b/weed/storage/needle/needle_read_page.go index 82142de4a..ab0a69739 100644 --- a/weed/storage/needle/needle_read_page.go +++ b/weed/storage/needle/needle_read_page.go @@ -64,6 +64,9 @@ func (n *Needle) ReadNeedleMeta(r backend.BackendStorageFile, offset int64, size dataSize := GetActualSize(size, version) stopOffset := offset + dataSize metaSize := stopOffset - startOffset + if metaSize < 0 || metaSize > 128*1024 { + return fmt.Errorf("invalid needle meta size %d: DataSize=%d, size=%d, offset=%d", metaSize, n.DataSize, size, offset) + } metaSlice := make([]byte, int(metaSize)) count, err = r.ReadAt(metaSlice, startOffset) |
