Aias00 opened a new issue, #3535:
URL: https://github.com/apache/dubbo-go/issues/3535
### Problem
`common.ServiceMap.GetServiceByServiceKey` returns `nil` when the
protocol/serviceKey is not registered (`common/rpc_service.go:189-199`). The
default `ProxyInvoker.Invoke` guards this
(`proxy/proxy_factory/default.go:111-115`):
```go
svc := common.ServiceMap.GetServiceByServiceKey(proto, url.ServiceKey())
if svc == nil {
logger.Errorf("[Proxy] cannot find service [%s] in %s", path, proto)
result.SetError(perrors.Errorf("cannot find service [%s] in %s", path,
proto))
return result
}
```
Two other call sites dereference the result **without** a nil check:
- `filter/generic/service_filter.go:83-84` (generic `$invoke` filter):
```go
svc := common.ServiceMap.GetServiceByServiceKey(ivkURL.Protocol,
ivkURL.ServiceKey())
method := svc.Method()[mtdName] // nil deref if svc == nil
```
- `proxy/proxy_factory/pass_through.go:89,103`
(`PassThroughProxyInvoker.Invoke`):
```go
srv := common.ServiceMap.GetServiceByServiceKey(url.Protocol,
url.ServiceKey())
...
method := srv.Method()["Service"] // nil deref if srv == nil
```
`(*Service).Method()` accesses `s.methods` with no nil receiver guard, so a
nil `*Service` panics.
### Current behavior
A generic (`$invoke`) invocation, or a `PassThroughProxyInvoker` invocation,
that routes to a service key not present in `ServiceMap` (unregistered service,
protocol key mismatch, exporter/service-map desync during dynamic re-export, or
an invocation arriving during/after unexport) crashes the provider goroutine
with a nil-pointer panic instead of returning an error.
### Expected behavior
Both call sites should nil-check `GetServiceByServiceKey`'s result and
return a clear error, matching the default `ProxyInvoker`.
### Suggested approach
Mirror the default invoker's guard:
```go
svc := common.ServiceMap.GetServiceByServiceKey(proto, serviceKey)
if svc == nil {
return error // "service ... is not found, protocol: ..."
}
```
in `filter/generic/service_filter.go` (return `*result.RPCResult{Err: ...}`)
and `proxy/proxy_factory/pass_through.go` (set `result.Err` and return).
### Acceptance criteria
- [ ] `filter/generic/service_filter.go` nil-checks `svc` before
`svc.Method()`.
- [ ] `proxy/proxy_factory/pass_through.go` nil-checks `srv` before
`srv.Method()["Service"]`.
- [ ] A regression test asserts an unregistered service returns an error
instead of panicking.
- [ ] Existing generic / proxy tests remain green.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]