Files
metasploit-gs/lib/metasploit/framework/thread_factory_provider.rb
T
Luke Imhoff d9a25005a6 Wrap Msf::Framework#threads in Metasploit::Framework::ThreadFactoryProvider
MSP-11605

`Rex::ThreadFactory.provider` needs to be set in
`Msf::Framework#initialize`, but setting it directly to
`Msf::Framework#threads` eliminates the laziness of
`Msf::Framework#threads`.  In order keep `framework.threads` lazy,
`framework` is wrapped in a
`Metasploit::Framework::ThreadFactoryProvider`, which responds to
`spawn`, which is needed by `Rex::ThreadFactory`, by calling
`framework.threads.spawn`, which lazily initialized `framework.threads`
when the first thread needs to be spawned.
2014-11-13 14:08:26 -06:00

26 lines
952 B
Ruby

# Wraps {Msf::Framework} so that {Msf::Framework#threads} is only created on the first call to {#spawn} by
# {Rex::ThreadFactory#spawn}, which allows the threads used by {Msf::ThreadManager} to be created lazily.
#
# @example Setting Rex::ThreadFactory.provider and spawning threads
# Rex::ThreadFactory.provider = Metasploit::Framework::ThreadFactoryProvider.new(framework: framework)
# # framework.threads created here
# Rex::ThreadFactory.spawn("name", false) { ... }
#
class Metasploit::Framework::ThreadFactoryProvider < Metasploit::Model::Base
#
# Attributes
#
# @!attribute framework
# The framework managing the spawned threads.
#
# @return [Msf::Framework]
attr_accessor :framework
# Spawns a thread monitored by {Msf::ThreadManager} in {Msf::Framework#threads}.
#
# (see Msf::ThreadManager#spawn)
def spawn(name, critical, *args, &block)
framework.threads.spawn(name, critical, *args, &block)
end
end