aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/binary
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/binary')
-rw-r--r--src/encoding/binary/binary.go7
-rw-r--r--src/encoding/binary/binary_test.go20
2 files changed, 25 insertions, 2 deletions
diff --git a/src/encoding/binary/binary.go b/src/encoding/binary/binary.go
index 158e3e9d7f..3fb18a7a03 100644
--- a/src/encoding/binary/binary.go
+++ b/src/encoding/binary/binary.go
@@ -479,7 +479,6 @@ func dataSize(v reflect.Value) int {
if s := sizeof(v.Type().Elem()); s >= 0 {
return s * v.Len()
}
- return -1
case reflect.Struct:
t := v.Type()
@@ -491,8 +490,12 @@ func dataSize(v reflect.Value) int {
return size
default:
- return sizeof(v.Type())
+ if v.IsValid() {
+ return sizeof(v.Type())
+ }
}
+
+ return -1
}
// sizeof returns the size >= 0 of variables for the given type or -1 if the type is not acceptable.
diff --git a/src/encoding/binary/binary_test.go b/src/encoding/binary/binary_test.go
index 4e1fb59f03..4b22b28843 100644
--- a/src/encoding/binary/binary_test.go
+++ b/src/encoding/binary/binary_test.go
@@ -351,6 +351,26 @@ func TestSizeStructCache(t *testing.T) {
}
}
+func TestSizeInvalid(t *testing.T) {
+ testcases := []any{
+ int(0),
+ new(int),
+ (*int)(nil),
+ [1]uint{},
+ new([1]uint),
+ (*[1]uint)(nil),
+ []int{},
+ []int(nil),
+ new([]int),
+ (*[]int)(nil),
+ }
+ for _, tc := range testcases {
+ if got := Size(tc); got != -1 {
+ t.Errorf("Size(%T) = %d, want -1", tc, got)
+ }
+ }
+}
+
// An attempt to read into a struct with an unexported field will
// panic. This is probably not the best choice, but at this point
// anything else would be an API change.