aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@uber.com>2019-03-19 20:56:27 -0700
committerChris Lu <chris.lu@uber.com>2019-03-19 20:56:27 -0700
commitcea5c53bf7943f7735d74c1e9f568ba633474e5d (patch)
tree0a7088c6f7529e5b05fd8758d315037422949d4f
parentda871896c345372780c35de7364b42d910935c53 (diff)
downloadseaweedfs-cea5c53bf7943f7735d74c1e9f568ba633474e5d.tar.xz
seaweedfs-cea5c53bf7943f7735d74c1e9f568ba633474e5d.zip
fix length checking
fix https://github.com/chrislusf/seaweedfs/issues/890
-rw-r--r--weed/storage/needle_read_write.go30
1 files changed, 14 insertions, 16 deletions
diff --git a/weed/storage/needle_read_write.go b/weed/storage/needle_read_write.go
index 4e6bd9cc7..0a73b2977 100644
--- a/weed/storage/needle_read_write.go
+++ b/weed/storage/needle_read_write.go
@@ -206,15 +206,13 @@ func (n *Needle) ParseNeedleHeader(bytes []byte) {
n.Size = util.BytesToUint32(bytes[CookieSize+NeedleIdSize : NeedleEntrySize])
}
-var ErrIndexOutOfRange = fmt.Errorf("index out of range")
-
func (n *Needle) readNeedleDataVersion2(bytes []byte) (err error) {
index, lenBytes := 0, len(bytes)
if index < lenBytes {
n.DataSize = util.BytesToUint32(bytes[index : index+4])
index = index + 4
- if int(n.DataSize)+index >= lenBytes {
- return ErrIndexOutOfRange
+ if int(n.DataSize)+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 1)
}
n.Data = bytes[index : index+int(n.DataSize)]
index = index + int(n.DataSize)
@@ -224,8 +222,8 @@ func (n *Needle) readNeedleDataVersion2(bytes []byte) (err error) {
if index < lenBytes && n.HasName() {
n.NameSize = uint8(bytes[index])
index = index + 1
- if int(n.NameSize)+index >= lenBytes {
- return ErrIndexOutOfRange
+ if int(n.NameSize)+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 2)
}
n.Name = bytes[index : index+int(n.NameSize)]
index = index + int(n.NameSize)
@@ -233,34 +231,34 @@ func (n *Needle) readNeedleDataVersion2(bytes []byte) (err error) {
if index < lenBytes && n.HasMime() {
n.MimeSize = uint8(bytes[index])
index = index + 1
- if int(n.MimeSize)+index >= lenBytes {
- return ErrIndexOutOfRange
+ if int(n.MimeSize)+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 3)
}
n.Mime = bytes[index : index+int(n.MimeSize)]
index = index + int(n.MimeSize)
}
if index < lenBytes && n.HasLastModifiedDate() {
- if LastModifiedBytesLength+index >= lenBytes {
- return ErrIndexOutOfRange
+ if LastModifiedBytesLength+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 4)
}
n.LastModified = util.BytesToUint64(bytes[index : index+LastModifiedBytesLength])
index = index + LastModifiedBytesLength
}
if index < lenBytes && n.HasTtl() {
- if TtlBytesLength+index >= lenBytes {
- return ErrIndexOutOfRange
+ if TtlBytesLength+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 5)
}
n.Ttl = LoadTTLFromBytes(bytes[index : index+TtlBytesLength])
index = index + TtlBytesLength
}
if index < lenBytes && n.HasPairs() {
- if 2+index >= lenBytes {
- return ErrIndexOutOfRange
+ if 2+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 6)
}
n.PairsSize = util.BytesToUint16(bytes[index : index+2])
index += 2
- if int(n.PairsSize)+index >= lenBytes {
- return ErrIndexOutOfRange
+ if int(n.PairsSize)+index > lenBytes {
+ return fmt.Errorf("index out of range %d", 7)
}
end := index + int(n.PairsSize)
n.Pairs = bytes[index:end]