forked from mirror/go-json
Merge pull request #62 from zchee/fix-decode-checkptr
Fix checkptr validation error on decode
This commit is contained in:
commit
73ba04190f
|
@ -31,8 +31,7 @@ func (d *arrayDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
idx := 0
|
idx := 0
|
||||||
for {
|
for {
|
||||||
s.cursor++
|
s.cursor++
|
||||||
addr := uintptr(p) + uintptr(idx)*d.size
|
if err := d.valueDecoder.decodeStream(s, unsafe.Pointer(uintptr(p)+uintptr(idx)*d.size)); err != nil {
|
||||||
if err := d.valueDecoder.decodeStream(s, unsafe.Pointer(addr)); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.skipWhiteSpace()
|
s.skipWhiteSpace()
|
||||||
|
@ -91,8 +90,7 @@ func (d *arrayDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (int64
|
||||||
idx := 0
|
idx := 0
|
||||||
for {
|
for {
|
||||||
cursor++
|
cursor++
|
||||||
addr := uintptr(p) + uintptr(idx)*d.size
|
c, err := d.valueDecoder.decode(buf, cursor, unsafe.Pointer(uintptr(p)+uintptr(idx)*d.size))
|
||||||
c, err := d.valueDecoder.decode(buf, cursor, unsafe.Pointer(addr))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,8 +90,7 @@ func (d *sliceDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
dst := sliceHeader{data: data, len: idx, cap: cap}
|
dst := sliceHeader{data: data, len: idx, cap: cap}
|
||||||
copySlice(d.elemType, dst, src)
|
copySlice(d.elemType, dst, src)
|
||||||
}
|
}
|
||||||
addr := uintptr(data) + uintptr(idx)*d.size
|
if err := d.valueDecoder.decodeStream(s, unsafe.Pointer(uintptr(data)+uintptr(idx)*d.size)); err != nil {
|
||||||
if err := d.valueDecoder.decodeStream(s, unsafe.Pointer(addr)); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.skipWhiteSpace()
|
s.skipWhiteSpace()
|
||||||
|
@ -191,8 +190,7 @@ func (d *sliceDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (int64
|
||||||
dst := sliceHeader{data: data, len: idx, cap: cap}
|
dst := sliceHeader{data: data, len: idx, cap: cap}
|
||||||
copySlice(d.elemType, dst, src)
|
copySlice(d.elemType, dst, src)
|
||||||
}
|
}
|
||||||
addr := uintptr(data) + uintptr(idx)*d.size
|
c, err := d.valueDecoder.decode(buf, cursor, unsafe.Pointer(uintptr(data)+uintptr(idx)*d.size))
|
||||||
c, err := d.valueDecoder.decode(buf, cursor, unsafe.Pointer(addr))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,8 +54,7 @@ func (d *structDecoder) decodeStream(s *stream, p unsafe.Pointer) error {
|
||||||
k := *(*string)(unsafe.Pointer(&key))
|
k := *(*string)(unsafe.Pointer(&key))
|
||||||
field, exists := d.fieldMap[k]
|
field, exists := d.fieldMap[k]
|
||||||
if exists {
|
if exists {
|
||||||
addr := uintptr(p) + field.offset
|
if err := field.dec.decodeStream(s, unsafe.Pointer(uintptr(p)+field.offset)); err != nil {
|
||||||
if err := field.dec.decodeStream(s, unsafe.Pointer(addr)); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if s.disallowUnknownFields {
|
} else if s.disallowUnknownFields {
|
||||||
|
@ -109,8 +108,7 @@ func (d *structDecoder) decode(buf []byte, cursor int64, p unsafe.Pointer) (int6
|
||||||
k := *(*string)(unsafe.Pointer(&key))
|
k := *(*string)(unsafe.Pointer(&key))
|
||||||
field, exists := d.fieldMap[k]
|
field, exists := d.fieldMap[k]
|
||||||
if exists {
|
if exists {
|
||||||
addr := uintptr(p) + field.offset
|
c, err := field.dec.decode(buf, cursor, unsafe.Pointer(uintptr(p)+field.offset))
|
||||||
c, err := field.dec.decode(buf, cursor, unsafe.Pointer(addr))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue