Skip to content

Commit

Permalink
check required data size
Browse files Browse the repository at this point in the history
  • Loading branch information
shamaton committed Oct 19, 2022
1 parent 0f57acc commit 2e916ba
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 0 deletions.
12 changes: 12 additions & 0 deletions internal/decoding/decoding.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,10 @@ func (d *decoder) decode(rv reflect.Value, offset int) (int, error) {
return 0, err
}

if err = d.hasRequiredLeastSliceSize(o, l); err != nil {
return 0, err
}

// check fixed type
fixedOffset, found, err := d.asFixedSlice(rv, o, l)
if err != nil {
Expand Down Expand Up @@ -223,6 +227,10 @@ func (d *decoder) decode(rv reflect.Value, offset int) (int, error) {
return 0, fmt.Errorf("%v len is %d, but msgpack has %d elements", rv.Type(), rv.Len(), l)
}

if err = d.hasRequiredLeastSliceSize(o, l); err != nil {
return 0, err
}

// create array dynamically
for i := 0; i < l; i++ {
o, err = d.decode(rv.Index(i), o)
Expand All @@ -245,6 +253,10 @@ func (d *decoder) decode(rv reflect.Value, offset int) (int, error) {
return 0, err
}

if err = d.hasRequiredLeastMapSize(o, l); err != nil {
return 0, err
}

// check fixed type
fixedOffset, found, err := d.asFixedMap(rv, o, l)
if err != nil {
Expand Down
7 changes: 7 additions & 0 deletions internal/decoding/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@ func (d *decoder) asInterface(offset int, k reflect.Kind) (interface{}, int, err
return nil, 0, err
}

if err = d.hasRequiredLeastSliceSize(o, l); err != nil {
return nil, 0, err
}

v := make([]interface{}, l)
for i := 0; i < l; i++ {
vv, o2, err := d.asInterface(o, k)
Expand All @@ -125,6 +129,9 @@ func (d *decoder) asInterface(offset int, k reflect.Kind) (interface{}, int, err
if err != nil {
return nil, 0, err
}
if err = d.hasRequiredLeastMapSize(o, l); err != nil {
return nil, 0, err
}
v := make(map[interface{}]interface{}, l)
for i := 0; i < l; i++ {
if d.canSetAsMapKey(o) != nil {
Expand Down
10 changes: 10 additions & 0 deletions internal/decoding/map.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package decoding

import (
"encoding/binary"
"errors"
"reflect"

"github.com/shamaton/msgpack/v2/def"
Expand Down Expand Up @@ -80,9 +81,18 @@ func (d *decoder) mapLength(offset int, k reflect.Kind) (int, int, error) {
}
return int(binary.BigEndian.Uint32(bs)), offset, nil
}

return 0, 0, d.errorTemplate(code, k)
}

func (d *decoder) hasRequiredLeastMapSize(offset, length int) error {
// minimum check (byte length)
if len(d.data[offset:]) < length*2 {
return errors.New("data length lacks to create map")
}
return nil
}

func (d *decoder) asFixedMap(rv reflect.Value, offset int, l int) (int, bool, error) {
t := rv.Type()

Expand Down
9 changes: 9 additions & 0 deletions internal/decoding/slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package decoding

import (
"encoding/binary"
"errors"
"reflect"

"github.com/shamaton/msgpack/v2/def"
Expand Down Expand Up @@ -57,6 +58,14 @@ func (d *decoder) sliceLength(offset int, k reflect.Kind) (int, int, error) {
return 0, 0, d.errorTemplate(code, k)
}

func (d *decoder) hasRequiredLeastSliceSize(offset, length int) error {
// minimum check (byte length)
if len(d.data[offset:]) < length {
return errors.New("data length lacks to create map")
}
return nil
}

func (d *decoder) asFixedSlice(rv reflect.Value, offset int, l int) (int, bool, error) {
t := rv.Type()
k := t.Elem().Kind()
Expand Down
8 changes: 8 additions & 0 deletions internal/decoding/struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ func (d *decoder) setStructFromArray(rv reflect.Value, offset int, k reflect.Kin
return 0, err
}

if err = d.hasRequiredLeastSliceSize(o, l); err != nil {
return 0, err
}

// find or create reference
var scta *structCacheTypeArray
cache, findCache := mapSCTA.Load(rv.Type())
Expand Down Expand Up @@ -99,6 +103,10 @@ func (d *decoder) setStructFromMap(rv reflect.Value, offset int, k reflect.Kind)
return 0, err
}

if err = d.hasRequiredLeastMapSize(o, l); err != nil {
return 0, err
}

var sctm *structCacheTypeMap
cache, cacheFind := mapSCTM.Load(rv.Type())
if !cacheFind {
Expand Down

0 comments on commit 2e916ba

Please sign in to comment.