]> Cypherpunks.ru repositories - gostls13.git/commitdiff
encoding/binary: on invalid type return -1 from Size
authorIan Lance Taylor <iant@golang.org>
Tue, 20 Jun 2023 16:38:39 +0000 (09:38 -0700)
committerGopher Robot <gobot@golang.org>
Tue, 20 Jun 2023 18:28:44 +0000 (18:28 +0000)
Size is defined as returning -1 if the type is not fixed-size.
Before this CL cases like Size((*[]int)(nil)) would crash.

Fixes #60892

Change-Id: Iee8e20a0aee24b542b78cb4160c3b2c5a3eb02c2
Reviewed-on: https://go-review.googlesource.com/c/go/+/504575
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
src/encoding/binary/binary.go
src/encoding/binary/binary_test.go

index 158e3e9d7f18805c1f73501712c136ef7ac9d1a6..3fb18a7a03c4ffd9ee25fc271c2cb00a3de8d884 100644 (file)
@@ -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.
index 4e1fb59f03c11e20a105f951e021a0107148e1f1..4b22b28843660113c95a1ef8e6c43ce7e5edbf60 100644 (file)
@@ -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.