From 18a6f94766b07b76a325180d101c4e280dcf6a14 Mon Sep 17 00:00:00 2001 From: AlexStocks Date: Tue, 12 Apr 2022 17:59:25 +0800 Subject: [PATCH] fix fatal error: do not handle nil package --- protocol/dubbo/dubbo_codec.go | 24 ++++++++++++++---------- remoting/codec.go | 2 +- remoting/getty/listener.go | 8 ++++---- remoting/getty/readwriter.go | 10 ++++++++-- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/protocol/dubbo/dubbo_codec.go b/protocol/dubbo/dubbo_codec.go index dee86a9ecd..5f287c3159 100644 --- a/protocol/dubbo/dubbo_codec.go +++ b/protocol/dubbo/dubbo_codec.go @@ -160,26 +160,30 @@ func (c *DubboCodec) EncodeResponse(response *remoting.Response) (*bytes.Buffer, } // Decode data, including request and response. -func (c *DubboCodec) Decode(data []byte) (remoting.DecodeResult, int, error) { - var res remoting.DecodeResult - +func (c *DubboCodec) Decode(data []byte) (*remoting.DecodeResult, int, error) { dataLen := len(data) if dataLen < impl.HEADER_LENGTH { // check whether header bytes is enough or not - return res, 0, nil + return nil, 0, nil } if c.isRequest(data) { req, length, err := c.decodeRequest(data) if err != nil { - return remoting.DecodeResult{}, length, perrors.WithStack(err) + return nil, length, perrors.WithStack(err) + } + if req == ((*remoting.Request)(nil)) { + return nil, length, err } - return remoting.DecodeResult{IsRequest: true, Result: req}, length, perrors.WithStack(err) + return &remoting.DecodeResult{IsRequest: true, Result: req}, length, perrors.WithStack(err) } - resp, length, err := c.decodeResponse(data) + rsp, length, err := c.decodeResponse(data) if err != nil { - return remoting.DecodeResult{}, length, perrors.WithStack(err) + return nil, length, perrors.WithStack(err) } - return remoting.DecodeResult{IsRequest: false, Result: resp}, length, perrors.WithStack(err) + if rsp == ((*remoting.Response)(nil)) { + return nil, length, err + } + return &remoting.DecodeResult{IsRequest: false, Result: rsp}, length, perrors.WithStack(err) } func (c *DubboCodec) isRequest(data []byte) bool { @@ -247,7 +251,6 @@ func (c *DubboCodec) decodeResponse(data []byte) (*remoting.Response, int, error if err != nil { originErr := perrors.Cause(err) // if the data is very big, so the receive need much times. - logger.Errorf("pkg.Unmarshal(len(@data):%d) = error:%+v", buf.Len(), err) if originErr == hessian.ErrHeaderNotEnough { // this is impossible, as dubbo_codec.go:DubboCodec::Decode() line 167 return nil, 0, nil } @@ -255,6 +258,7 @@ func (c *DubboCodec) decodeResponse(data []byte) (*remoting.Response, int, error return nil, hessian.HEADER_LENGTH + pkg.GetBodyLen(), nil } + logger.Warnf("pkg.Unmarshal(len(@data):%d) = error:%+v", buf.Len(), err) return nil, 0, perrors.WithStack(err) } response := &remoting.Response{ diff --git a/remoting/codec.go b/remoting/codec.go index d0ede60958..f2d5619699 100644 --- a/remoting/codec.go +++ b/remoting/codec.go @@ -26,7 +26,7 @@ import ( type Codec interface { EncodeRequest(request *Request) (*bytes.Buffer, error) EncodeResponse(response *Response) (*bytes.Buffer, error) - Decode(data []byte) (DecodeResult, int, error) + Decode(data []byte) (*DecodeResult, int, error) } type DecodeResult struct { diff --git a/remoting/getty/listener.go b/remoting/getty/listener.go index 356353950e..c79f242995 100644 --- a/remoting/getty/listener.go +++ b/remoting/getty/listener.go @@ -94,8 +94,8 @@ func (h *RpcClientHandler) OnClose(session getty.Session) { // OnMessage get response from getty server, and update the session to the getty client session list func (h *RpcClientHandler) OnMessage(session getty.Session, pkg interface{}) { - result, ok := pkg.(remoting.DecodeResult) - if !ok { + result, ok := pkg.(*remoting.DecodeResult) + if !ok || result == ((*remoting.DecodeResult)(nil)) { logger.Errorf("[RpcClientHandler.OnMessage] getty client gets an unexpected rpc result: %#v", result) return } @@ -232,8 +232,8 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) { } h.rwlock.Unlock() - decodeResult, drOK := pkg.(remoting.DecodeResult) - if !drOK { + decodeResult, drOK := pkg.(*remoting.DecodeResult) + if !drOK || decodeResult == ((*remoting.DecodeResult)(nil)) { logger.Errorf("illegal package{%#v}", pkg) return } diff --git a/remoting/getty/readwriter.go b/remoting/getty/readwriter.go index ad95d9e607..18904dc363 100644 --- a/remoting/getty/readwriter.go +++ b/remoting/getty/readwriter.go @@ -49,7 +49,10 @@ func (p *RpcClientPackageHandler) Read(ss getty.Session, data []byte) (interface if err != nil { err = perrors.WithStack(err) } - if rsp.Result == nil { + if rsp == ((*remoting.DecodeResult)(nil)) { + return nil, length, err + } + if rsp.Result == ((*remoting.Response)(nil)) || rsp.Result == ((*remoting.Request)(nil)) { return nil, length, err } return rsp, length, err @@ -97,7 +100,10 @@ func (p *RpcServerPackageHandler) Read(ss getty.Session, data []byte) (interface if err != nil { err = perrors.WithStack(err) } - if req.Result == nil { + if req == ((*remoting.DecodeResult)(nil)) { + return nil, length, err + } + if req.Result == ((*remoting.Request)(nil)) || req.Result == ((*remoting.Response)(nil)) { return nil, length, err // as getty rule } return req, length, err