From 352b4cf1c83cc0de9c3c19576cde912dfd942bf7 Mon Sep 17 00:00:00 2001 From: HD Moore Date: Wed, 6 Oct 2010 23:20:13 +0000 Subject: [PATCH] Dispatch incoming requests as threads git-svn-id: file:///home/svn/framework3/trunk@10579 4d416f70-5f16-0410-b530-b9f4589650da --- lib/msf/core/rpc/service.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/msf/core/rpc/service.rb b/lib/msf/core/rpc/service.rb index 91057f00a6..747b33dbab 100644 --- a/lib/msf/core/rpc/service.rb +++ b/lib/msf/core/rpc/service.rb @@ -8,8 +8,12 @@ module RPC class Service < ::XMLRPC::BasicServer attr_accessor :service, :state, :on_input, :on_output, :on_error + attr_accessor :dispatcher_timeout def initialize(srvhost, srvport, ssl=false, cert=nil, ckey=nil) + + self.dispatcher_timeout = 0 + self.service = Rex::Socket::TcpServer.create( 'LocalHost' => srvhost, 'LocalPort' => srvport, @@ -20,7 +24,18 @@ class Service < ::XMLRPC::BasicServer on_client_connect(client) } self.service.on_client_data_proc = Proc.new { |client| - on_client_data(client) + Thread.new(client) do |client_copy| + begin + Timeout.timeout(self.dispatcher_timeout) do + on_client_data(client) + end + rescue ::EOFError => e + raise e + rescue ::Exception => e + wlog("XMLRPC Server Error: #{client.inspect} #{e.class} #{e} #{e.backtrace}") + raise e + end + end } self.service.on_client_close_proc = Proc.new { |client| on_client_close(client)