rpc: fixed params parsing problem which could lead to a panic
check argument type before parsing params recover from panic in ipc channel
This commit is contained in:
parent
56f8699a6c
commit
c3c5f8b654
@ -626,9 +626,14 @@ func (args *GetBlockByHashArgs) UnmarshalJSON(b []byte) (err error) {
|
||||
|
||||
args.IncludeTxs = obj[1].(bool)
|
||||
|
||||
if inclTx, ok := obj[1].(bool); ok {
|
||||
args.IncludeTxs = inclTx
|
||||
return nil
|
||||
}
|
||||
|
||||
return shared.NewInvalidTypeError("includeTxs", "not a bool")
|
||||
}
|
||||
|
||||
type GetBlockByNumberArgs struct {
|
||||
BlockNumber int64
|
||||
IncludeTxs bool
|
||||
@ -648,11 +653,14 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
args.IncludeTxs = obj[1].(bool)
|
||||
|
||||
if inclTx, ok := obj[1].(bool); ok {
|
||||
args.IncludeTxs = inclTx
|
||||
return nil
|
||||
}
|
||||
|
||||
return shared.NewInvalidTypeError("includeTxs", "not a bool")
|
||||
}
|
||||
|
||||
type BlockFilterArgs struct {
|
||||
Earliest int64
|
||||
Latest int64
|
||||
|
@ -62,13 +62,18 @@ type EthereumClient interface {
|
||||
func handle(id int, conn net.Conn, api shared.EthereumApi, c codec.Codec) {
|
||||
codec := c.New(conn)
|
||||
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
glog.Errorf("panic: %v\n", r)
|
||||
}
|
||||
codec.Close()
|
||||
}()
|
||||
|
||||
for {
|
||||
requests, isBatch, err := codec.ReadRequest()
|
||||
if err == io.EOF {
|
||||
codec.Close()
|
||||
return
|
||||
} else if err != nil {
|
||||
codec.Close()
|
||||
glog.V(logger.Debug).Infof("Closed IPC Conn %06d recv err - %v\n", id, err)
|
||||
return
|
||||
}
|
||||
@ -87,7 +92,6 @@ func handle(id int, conn net.Conn, api shared.EthereumApi, c codec.Codec) {
|
||||
|
||||
err = codec.WriteResponse(responses[:responseCount])
|
||||
if err != nil {
|
||||
codec.Close()
|
||||
glog.V(logger.Debug).Infof("Closed IPC Conn %06d send err - %v\n", id, err)
|
||||
return
|
||||
}
|
||||
@ -98,7 +102,6 @@ func handle(id int, conn net.Conn, api shared.EthereumApi, c codec.Codec) {
|
||||
rpcResponse = shared.NewRpcResponse(requests[0].Id, requests[0].Jsonrpc, res, err)
|
||||
err = codec.WriteResponse(rpcResponse)
|
||||
if err != nil {
|
||||
codec.Close()
|
||||
glog.V(logger.Debug).Infof("Closed IPC Conn %06d send err - %v\n", id, err)
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user