Merge pull request #125422 from benluddy/cbor-disable-binarymarshaler
KEP-4222: Disable recognition of Binary(Unm|M)arshaler in CBOR serializer.
This commit is contained in:
		@@ -135,6 +135,10 @@ var Decode cbor.DecMode = func() cbor.DecMode {
 | 
			
		||||
 | 
			
		||||
		// Reject anything other than the simple values true, false, and null.
 | 
			
		||||
		SimpleValues: simpleValues,
 | 
			
		||||
 | 
			
		||||
		// Disable default recognition of types implementing encoding.BinaryUnmarshaler,
 | 
			
		||||
		// which is not recognized for JSON decoding.
 | 
			
		||||
		BinaryUnmarshaler: cbor.BinaryUnmarshalerNone,
 | 
			
		||||
	}.DecMode()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,12 @@ import (
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type int64BinaryUnmarshaler int64
 | 
			
		||||
 | 
			
		||||
func (i *int64BinaryUnmarshaler) UnmarshalBinary(_ []byte) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDecode(t *testing.T) {
 | 
			
		||||
	hex := func(h string) []byte {
 | 
			
		||||
		b, err := hex.DecodeString(h)
 | 
			
		||||
@@ -203,6 +209,20 @@ func TestDecode(t *testing.T) {
 | 
			
		||||
			want:          "AQIDBA==",
 | 
			
		||||
			assertOnError: assertNilError,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "into non-string type implementing BinaryUnmarshaler",
 | 
			
		||||
			in:   hex("40"), // ''
 | 
			
		||||
			into: int64BinaryUnmarshaler(7),
 | 
			
		||||
			assertOnError: assertOnConcreteError(func(t *testing.T, e *cbor.UnmarshalTypeError) {
 | 
			
		||||
				want := &cbor.UnmarshalTypeError{
 | 
			
		||||
					CBORType: "byte string",
 | 
			
		||||
					GoType:   reflect.TypeFor[int64BinaryUnmarshaler]().String(),
 | 
			
		||||
				}
 | 
			
		||||
				if e.CBORType != want.CBORType || e.GoType != want.GoType {
 | 
			
		||||
					t.Errorf("expected %q, got %q", want, e)
 | 
			
		||||
				}
 | 
			
		||||
			}),
 | 
			
		||||
		},
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	group(t, "text string", []test{
 | 
			
		||||
 
 | 
			
		||||
@@ -87,6 +87,10 @@ var Encode cbor.EncMode = func() cbor.EncMode {
 | 
			
		||||
		// base64 encoding of the original bytes. No base64 encoding or decoding needs to be
 | 
			
		||||
		// performed for []byte-to-CBOR-to-[]byte roundtrips.
 | 
			
		||||
		ByteSliceLaterFormat: cbor.ByteSliceLaterFormatBase64,
 | 
			
		||||
 | 
			
		||||
		// Disable default recognition of types implementing encoding.BinaryMarshaler, which
 | 
			
		||||
		// is not recognized for JSON encoding.
 | 
			
		||||
		BinaryMarshaler: cbor.BinaryMarshalerNone,
 | 
			
		||||
	}.EncMode()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err)
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,12 @@ import (
 | 
			
		||||
	"github.com/google/go-cmp/cmp"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type int64BinaryMarshaler int64
 | 
			
		||||
 | 
			
		||||
func (i int64BinaryMarshaler) MarshalBinary() ([]byte, error) {
 | 
			
		||||
	return []byte{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestEncode(t *testing.T) {
 | 
			
		||||
	for _, tc := range []struct {
 | 
			
		||||
		name          string
 | 
			
		||||
@@ -34,6 +40,12 @@ func TestEncode(t *testing.T) {
 | 
			
		||||
		want          []byte
 | 
			
		||||
		assertOnError func(t *testing.T, e error)
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			name:          "implementations of BinaryMarshaler are ignored",
 | 
			
		||||
			in:            int64BinaryMarshaler(7),
 | 
			
		||||
			want:          []byte{0x07},
 | 
			
		||||
			assertOnError: assertNilError,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name: "all duplicate fields are ignored", // Matches behavior of JSON serializer.
 | 
			
		||||
			in: struct {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user