From c3c5f8b654f9ddaeedeb2d3d5d1caf000e08320e Mon Sep 17 00:00:00 2001
From: Bas van Kervel <bas@ethdev.com>
Date: Thu, 29 Oct 2015 08:40:07 +0100
Subject: rpc: fixed params parsing problem which could lead to a panic

 check argument type before parsing params
 recover from panic in ipc channel
---
 rpc/comms/comms.go | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

(limited to 'rpc/comms')

diff --git a/rpc/comms/comms.go b/rpc/comms/comms.go
index 731b2f62e..61fba5722 100644
--- a/rpc/comms/comms.go
+++ b/rpc/comms/comms.go
@@ -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
 			}
-- 
cgit v1.2.3