Improve invalid reflect value handling.
It was previously possible for an invalid reflect value to lead to a panic in certain obscure cases. Rather than adding multiple checks for the invalid reflect value, handle invalid reflect values immediately.
This commit is contained in:
parent
f2641d5e6e
commit
a9907c1584
11
spew/dump.go
11
spew/dump.go
|
@ -139,8 +139,14 @@ func (d *dumpState) dumpPtr(v reflect.Value) {
|
||||||
// appropriately. It is a recursive function, however circular data structures
|
// appropriately. It is a recursive function, however circular data structures
|
||||||
// are detected and handled properly.
|
// are detected and handled properly.
|
||||||
func (d *dumpState) dump(v reflect.Value) {
|
func (d *dumpState) dump(v reflect.Value) {
|
||||||
// Handle pointers specially.
|
// Handle invalid reflect values immediately.
|
||||||
kind := v.Kind()
|
kind := v.Kind()
|
||||||
|
if kind == reflect.Invalid {
|
||||||
|
d.w.Write(invalidAngleBytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle pointers specially.
|
||||||
if kind == reflect.Ptr {
|
if kind == reflect.Ptr {
|
||||||
d.pad()
|
d.pad()
|
||||||
d.dumpPtr(v)
|
d.dumpPtr(v)
|
||||||
|
@ -169,7 +175,8 @@ func (d *dumpState) dump(v reflect.Value) {
|
||||||
|
|
||||||
switch kind {
|
switch kind {
|
||||||
case reflect.Invalid:
|
case reflect.Invalid:
|
||||||
d.w.Write(invalidAngleBytes)
|
// Do nothing. We should never get here since invalid has already
|
||||||
|
// been handled above.
|
||||||
|
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
printBool(d.w, v.Bool())
|
printBool(d.w, v.Bool())
|
||||||
|
|
|
@ -197,8 +197,14 @@ func (f *formatState) formatPtr(v reflect.Value) {
|
||||||
// dealing with and formats it appropriately. It is a recursive function,
|
// dealing with and formats it appropriately. It is a recursive function,
|
||||||
// however circular data structures are detected and handled properly.
|
// however circular data structures are detected and handled properly.
|
||||||
func (f *formatState) format(v reflect.Value) {
|
func (f *formatState) format(v reflect.Value) {
|
||||||
// Handle pointers specially.
|
// Handle invalid reflect values immediately.
|
||||||
kind := v.Kind()
|
kind := v.Kind()
|
||||||
|
if kind == reflect.Invalid {
|
||||||
|
f.fs.Write(invalidAngleBytes)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle pointers specially.
|
||||||
if kind == reflect.Ptr {
|
if kind == reflect.Ptr {
|
||||||
f.formatPtr(v)
|
f.formatPtr(v)
|
||||||
return
|
return
|
||||||
|
@ -224,7 +230,8 @@ func (f *formatState) format(v reflect.Value) {
|
||||||
|
|
||||||
switch kind {
|
switch kind {
|
||||||
case reflect.Invalid:
|
case reflect.Invalid:
|
||||||
f.fs.Write(invalidAngleBytes)
|
// Do nothing. We should never get here since invalid has already
|
||||||
|
// been handled above.
|
||||||
|
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
printBool(f.fs, v.Bool())
|
printBool(f.fs, v.Bool())
|
||||||
|
|
Loading…
Reference in New Issue