internal/impl: fix panic calling XXX_MessageName on aberrant messages
Call XXX_MessageName with best-effort. If it panics, oh-well.
Change-Id: I605ea074470b0c90b0bea8b36fa7d4a69368692d
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/194598
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/internal/impl/legacy_message.go b/internal/impl/legacy_message.go
index ff1c69b..6c52284 100644
--- a/internal/impl/legacy_message.go
+++ b/internal/impl/legacy_message.go
@@ -202,10 +202,14 @@
if name.IsValid() {
return name
}
- if m, ok := reflect.New(t).Interface().(interface{ XXX_MessageName() string }); ok {
- if name := pref.FullName(m.XXX_MessageName()); name.IsValid() {
- return name
+ func() {
+ defer func() { recover() }() // swallow possible nil panics
+ if m, ok := reflect.New(t).Interface().(interface{ XXX_MessageName() string }); ok {
+ name = pref.FullName(m.XXX_MessageName())
}
+ }()
+ if name.IsValid() {
+ return name
}
return aberrantDeriveFullName(t)
}