@@ -327,8 +327,11 @@ func (d *decoder) unmarshalMap(
327
327
}
328
328
329
329
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 )
332
335
return newOffset , err
333
336
}
334
337
@@ -491,9 +494,15 @@ func (d *decoder) decodeMap(
491
494
return offset , nil
492
495
}
493
496
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 ) {
495
501
pointerSize := ((size >> 3 ) & 0x3 ) + 1
496
502
newOffset := offset + pointerSize
503
+ if newOffset > uint (len (d .buffer )) {
504
+ return 0 , 0 , newOffsetError ()
505
+ }
497
506
pointerBytes := d .buffer [offset :newOffset ]
498
507
var prefix uint64
499
508
if pointerSize == 4 {
@@ -517,7 +526,7 @@ func (d *decoder) decodePointer(size uint, offset uint) (uint, uint) {
517
526
518
527
pointer := unpacked + pointerValueOffset
519
528
520
- return pointer , newOffset
529
+ return pointer , newOffset , nil
521
530
}
522
531
523
532
func (d * decoder ) decodeSlice (
@@ -659,7 +668,10 @@ func (d *decoder) decodeKey(offset uint) ([]byte, uint, error) {
659
668
return nil , 0 , err
660
669
}
661
670
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
+ }
663
675
key , _ , err := d .decodeKey (pointer )
664
676
return key , ptrOffset , err
665
677
}
@@ -686,7 +698,10 @@ func (d *decoder) nextValueOffset(offset uint, numberToSkip uint) (uint, error)
686
698
}
687
699
switch typeNum {
688
700
case _Pointer :
689
- _ , offset = d .decodePointer (size , offset )
701
+ _ , offset , err = d .decodePointer (size , offset )
702
+ if err != nil {
703
+ return 0 , err
704
+ }
690
705
case _Map :
691
706
numberToSkip += 2 * size
692
707
case _Slice :
0 commit comments