rpc: more accurate checking of handler method signatures #27287 (#990)

This changes the RPC server to ignore methods using *context.Context as parameter
and *error as return value type. Methods with such types would crash the server when
called.

Co-authored-by: Stephen Guo <stephen.fire@gmail.com>
This commit is contained in:
Daniel Liu 2025-04-28 10:45:50 +08:00 committed by GitHub
parent e6b7ae906b
commit 5af41b62a7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -214,19 +214,8 @@ func (c *callback) call(ctx context.Context, method string, args []reflect.Value
return results[0].Interface(), nil
}
// Is t context.Context or *context.Context?
func isContextType(t reflect.Type) bool {
for t.Kind() == reflect.Ptr {
t = t.Elem()
}
return t == contextType
}
// Does t satisfy the error interface?
func isErrorType(t reflect.Type) bool {
for t.Kind() == reflect.Ptr {
t = t.Elem()
}
return t.Implements(errorType)
}
@ -245,7 +234,7 @@ func isPubSub(methodType reflect.Type) bool {
if methodType.NumIn() < 2 || methodType.NumOut() != 2 {
return false
}
return isContextType(methodType.In(1)) &&
return methodType.In(1) == contextType &&
isSubscriptionType(methodType.Out(0)) &&
isErrorType(methodType.Out(1))
}