Skip to content

Commit ce9e0f3

Browse files
committed
Add bounds check to pointer decoding
1 parent ca06e3a commit ce9e0f3

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

decoder.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,11 @@ func (d *decoder) unmarshalMap(
327327
}
328328

329329
func (d *decoder) unmarshalPointer(size uint, offset uint, result reflect.Value, depth int) (uint, error) {
330-
pointer, newOffset := d.decodePointer(size, offset)
331-
_, err := d.decode(pointer, result, depth)
330+
pointer, newOffset, err := d.decodePointer(size, offset)
331+
if err != nil {
332+
return 0, err
333+
}
334+
_, err = d.decode(pointer, result, depth)
332335
return newOffset, err
333336
}
334337

@@ -491,9 +494,15 @@ func (d *decoder) decodeMap(
491494
return offset, nil
492495
}
493496

494-
func (d *decoder) decodePointer(size uint, offset uint) (uint, uint) {
497+
func (d *decoder) decodePointer(
498+
size uint,
499+
offset uint,
500+
) (uint, uint, error) {
495501
pointerSize := ((size >> 3) & 0x3) + 1
496502
newOffset := offset + pointerSize
503+
if newOffset > uint(len(d.buffer)) {
504+
return 0, 0, newOffsetError()
505+
}
497506
pointerBytes := d.buffer[offset:newOffset]
498507
var prefix uint64
499508
if pointerSize == 4 {
@@ -517,7 +526,7 @@ func (d *decoder) decodePointer(size uint, offset uint) (uint, uint) {
517526

518527
pointer := unpacked + pointerValueOffset
519528

520-
return pointer, newOffset
529+
return pointer, newOffset, nil
521530
}
522531

523532
func (d *decoder) decodeSlice(
@@ -659,7 +668,10 @@ func (d *decoder) decodeKey(offset uint) ([]byte, uint, error) {
659668
return nil, 0, err
660669
}
661670
if typeNum == _Pointer {
662-
pointer, ptrOffset := d.decodePointer(size, dataOffset)
671+
pointer, ptrOffset, err := d.decodePointer(size, dataOffset)
672+
if err != nil {
673+
return nil, 0, err
674+
}
663675
key, _, err := d.decodeKey(pointer)
664676
return key, ptrOffset, err
665677
}
@@ -686,7 +698,10 @@ func (d *decoder) nextValueOffset(offset uint, numberToSkip uint) (uint, error)
686698
}
687699
switch typeNum {
688700
case _Pointer:
689-
_, offset = d.decodePointer(size, offset)
701+
_, offset, err = d.decodePointer(size, offset)
702+
if err != nil {
703+
return 0, err
704+
}
690705
case _Map:
691706
numberToSkip += 2 * size
692707
case _Slice:

0 commit comments

Comments
 (0)