@@ -327,8 +327,11 @@ func (d *decoder) unmarshalMap(
327327}
328328
329329func (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
523532func (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