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.
 | 
							// Reject anything other than the simple values true, false, and null.
 | 
				
			||||||
		SimpleValues: simpleValues,
 | 
							SimpleValues: simpleValues,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Disable default recognition of types implementing encoding.BinaryUnmarshaler,
 | 
				
			||||||
 | 
							// which is not recognized for JSON decoding.
 | 
				
			||||||
 | 
							BinaryUnmarshaler: cbor.BinaryUnmarshalerNone,
 | 
				
			||||||
	}.DecMode()
 | 
						}.DecMode()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,6 +29,12 @@ import (
 | 
				
			|||||||
	"github.com/google/go-cmp/cmp"
 | 
						"github.com/google/go-cmp/cmp"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type int64BinaryUnmarshaler int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (i *int64BinaryUnmarshaler) UnmarshalBinary(_ []byte) error {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestDecode(t *testing.T) {
 | 
					func TestDecode(t *testing.T) {
 | 
				
			||||||
	hex := func(h string) []byte {
 | 
						hex := func(h string) []byte {
 | 
				
			||||||
		b, err := hex.DecodeString(h)
 | 
							b, err := hex.DecodeString(h)
 | 
				
			||||||
@@ -203,6 +209,20 @@ func TestDecode(t *testing.T) {
 | 
				
			|||||||
			want:          "AQIDBA==",
 | 
								want:          "AQIDBA==",
 | 
				
			||||||
			assertOnError: assertNilError,
 | 
								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{
 | 
						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
 | 
							// base64 encoding of the original bytes. No base64 encoding or decoding needs to be
 | 
				
			||||||
		// performed for []byte-to-CBOR-to-[]byte roundtrips.
 | 
							// performed for []byte-to-CBOR-to-[]byte roundtrips.
 | 
				
			||||||
		ByteSliceLaterFormat: cbor.ByteSliceLaterFormatBase64,
 | 
							ByteSliceLaterFormat: cbor.ByteSliceLaterFormatBase64,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Disable default recognition of types implementing encoding.BinaryMarshaler, which
 | 
				
			||||||
 | 
							// is not recognized for JSON encoding.
 | 
				
			||||||
 | 
							BinaryMarshaler: cbor.BinaryMarshalerNone,
 | 
				
			||||||
	}.EncMode()
 | 
						}.EncMode()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,12 @@ import (
 | 
				
			|||||||
	"github.com/google/go-cmp/cmp"
 | 
						"github.com/google/go-cmp/cmp"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type int64BinaryMarshaler int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (i int64BinaryMarshaler) MarshalBinary() ([]byte, error) {
 | 
				
			||||||
 | 
						return []byte{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestEncode(t *testing.T) {
 | 
					func TestEncode(t *testing.T) {
 | 
				
			||||||
	for _, tc := range []struct {
 | 
						for _, tc := range []struct {
 | 
				
			||||||
		name          string
 | 
							name          string
 | 
				
			||||||
@@ -34,6 +40,12 @@ func TestEncode(t *testing.T) {
 | 
				
			|||||||
		want          []byte
 | 
							want          []byte
 | 
				
			||||||
		assertOnError func(t *testing.T, e error)
 | 
							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.
 | 
								name: "all duplicate fields are ignored", // Matches behavior of JSON serializer.
 | 
				
			||||||
			in: struct {
 | 
								in: struct {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user