diff options
| author | Russ Cox <rsc@golang.org> | 2024-03-12 12:51:44 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2024-03-14 16:06:11 +0000 |
| commit | 376be64922f38a78c42c62db189be911160367f8 (patch) | |
| tree | 0e824935b1d9a7141a6dc7c7ac8a0c782cc784b2 /src/encoding | |
| parent | 4a1038fa52db57cee23a76fd2ea86247eff42f29 (diff) | |
| download | go-376be64922f38a78c42c62db189be911160367f8.tar.xz | |
encoding/gob: make x509.Certificate marshalable again
The OID type is not exported data like most of the other x509 structs.
Using it in x509.Certificate made Certificate not gob-compatible anymore,
which breaks real-world code. As a temporary fix, make gob ignore
that field, making it work as well as it did in Go 1.21.
For Go 1.23, we anticipate adding a proper fix and removing the gob
workaround. See #65633 and #66249 for more details.
For #66249.
Fixes #65633.
Change-Id: Idd1431d15063b3009e15d0565cd3120b9fa13f61
Reviewed-on: https://go-review.googlesource.com/c/go/+/571095
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Roland Shoemaker <roland@golang.org>
Diffstat (limited to 'src/encoding')
| -rw-r--r-- | src/encoding/gob/encode.go | 2 | ||||
| -rw-r--r-- | src/encoding/gob/type.go | 15 |
2 files changed, 14 insertions, 3 deletions
diff --git a/src/encoding/gob/encode.go b/src/encoding/gob/encode.go index 5f4d2539fa..c83071c717 100644 --- a/src/encoding/gob/encode.go +++ b/src/encoding/gob/encode.go @@ -601,7 +601,7 @@ func compileEnc(ut *userTypeInfo, building map[*typeInfo]bool) *encEngine { if ut.externalEnc == 0 && srt.Kind() == reflect.Struct { for fieldNum, wireFieldNum := 0, 0; fieldNum < srt.NumField(); fieldNum++ { f := srt.Field(fieldNum) - if !isSent(&f) { + if !isSent(srt, &f) { continue } op, indir := encOpFor(f.Type, seen, building) diff --git a/src/encoding/gob/type.go b/src/encoding/gob/type.go index 30d8ca61c4..3b1dde492c 100644 --- a/src/encoding/gob/type.go +++ b/src/encoding/gob/type.go @@ -538,7 +538,7 @@ func newTypeObject(name string, ut *userTypeInfo, rt reflect.Type) (gobType, err idToTypeSlice[st.id()] = st for i := 0; i < t.NumField(); i++ { f := t.Field(i) - if !isSent(&f) { + if !isSent(t, &f) { continue } typ := userType(f.Type).base @@ -576,7 +576,7 @@ func isExported(name string) bool { // isSent reports whether this struct field is to be transmitted. // It will be transmitted only if it is exported and not a chan or func field // or pointer to chan or func. -func isSent(field *reflect.StructField) bool { +func isSent(struct_ reflect.Type, field *reflect.StructField) bool { if !isExported(field.Name) { return false } @@ -589,6 +589,17 @@ func isSent(field *reflect.StructField) bool { if typ.Kind() == reflect.Chan || typ.Kind() == reflect.Func { return false } + + // Special case for Go 1.22: the x509.Certificate.Policies + // field is unencodable but also unused by default. + // Ignore it, so that x509.Certificate continues to be encodeable. + // Go 1.23 will add the right methods so that gob can + // handle the Policies field, and then we can remove this check. + // See go.dev/issue/65633. + if field.Name == "Policies" && struct_.PkgPath() == "crypto/x509" && struct_.Name() == "Certificate" { + return false + } + return true } |
