rpc: more accurate checking of handler method signatures (#27287)
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.
This commit is contained in:
parent
ae1d90e710
commit
84c3799e21
|
@ -214,19 +214,8 @@ func (c *callback) call(ctx context.Context, method string, args []reflect.Value
|
||||||
return results[0].Interface(), nil
|
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?
|
// Does t satisfy the error interface?
|
||||||
func isErrorType(t reflect.Type) bool {
|
func isErrorType(t reflect.Type) bool {
|
||||||
for t.Kind() == reflect.Ptr {
|
|
||||||
t = t.Elem()
|
|
||||||
}
|
|
||||||
return t.Implements(errorType)
|
return t.Implements(errorType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,7 +234,7 @@ func isPubSub(methodType reflect.Type) bool {
|
||||||
if methodType.NumIn() < 2 || methodType.NumOut() != 2 {
|
if methodType.NumIn() < 2 || methodType.NumOut() != 2 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return isContextType(methodType.In(1)) &&
|
return methodType.In(1) == contextType &&
|
||||||
isSubscriptionType(methodType.Out(0)) &&
|
isSubscriptionType(methodType.Out(0)) &&
|
||||||
isErrorType(methodType.Out(1))
|
isErrorType(methodType.Out(1))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue