16407f91c8
[Fixes #38426061, #38097411] Msf::Modules::Loader::Directory#read_module_content may calculate a non-existent module_path that gets passed to File.open causing an Errno::ENOENT exception to be raised when using the module cache with a module that has been moved to a new path (as is the case that originally found this bug) or deleted. Now, the exception is rescued and read_module_content returns an empty string (''), which load_module detects with module_content.empty? and returns earlier without attempting to module eval the (empty) content. As having Msf::Modules::Loader::Directory#read_module_content rescue the exception, meant there was another place that needed to log and error and store an error in Msf::ModuleManager#module_load_error_by_path, I refactored the error reporting to call Msf::Modules::Loader::Base#load_error, which handles writing to the log and setting the Hash, so the error reporting is consistent across the loaders. The exception hierarchy was also refactored so that namespace_module.metasploit_class now has an error raising counter-part: namespace_module.metasploit_class! that can be used with Msf::Modules::Loader::Base#load_error as it requires an exception, and not just a string so the exception class, message, and backtrace can be logged.
13 lines
235 B
Ruby
13 lines
235 B
Ruby
shared_context "Msf::Modules::Loader::Base" do
|
|
let(:parent_path) do
|
|
parent_pathname.to_s
|
|
end
|
|
|
|
let(:parent_pathname) do
|
|
root_pathname.join('modules')
|
|
end
|
|
|
|
let(:root_pathname) do
|
|
Pathname.new(Msf::Config.install_root)
|
|
end
|
|
end |