Use alias when reloading aliased module

Also speeds up module reloads by avoiding module instance creating
without a type.

Fixes #12026
This commit is contained in:
Adam Cammack 2019-08-22 11:19:31 -05:00
parent d8e8a33b46
commit 948918dacb
No known key found for this signature in database
GPG Key ID: C9378BA088092D66
2 changed files with 15 additions and 7 deletions

View File

@ -103,7 +103,9 @@ module Msf
end
if module_instance
module_instance.aliased_as = aliased_as
# If the module instance is populated by one of the recursive `create`
# calls this field may be set and we'll want to keep its original value
module_instance.aliased_as ||= aliased_as
end
module_instance

View File

@ -283,14 +283,20 @@ class Msf::Modules::Loader::Base
namespace_module = original_metasploit_class.parent
parent_path = namespace_module.parent_path
type = original_metasploit_class_or_instance.type
module_reference_name = original_metasploit_class_or_instance.refname
type = original_metasploit_class.type
module_reference_name = original_metasploit_class.refname
module_fullname = original_metasploit_class.fullname
module_used_name = original_metasploit_instance.fullname if original_metasploit_instance
dlog("Reloading module #{module_reference_name}...", 'core')
dlog("Reloading module #{module_fullname}...", 'core')
if load_module(parent_path, type, module_reference_name, :force => true, :reload => true)
# Create a new instance of the module
reloaded_module_instance = module_manager.create(module_reference_name)
# Create a new instance of the module, using the alias if one was used
reloaded_module_instance = module_manager.create(module_used_name || module_fullname)
if !reloaded_module_instance && module_fullname != module_used_name
reloaded_module_instance = module_manager.create(module_fullname)
reloaded_module_instance&.add_warning "Alias #{module_used_name} no longer available after reloading, using #{module_fullname}"
end
if reloaded_module_instance
if original_metasploit_instance
@ -304,7 +310,7 @@ class Msf::Modules::Loader::Base
return original_metasploit_class_or_instance
end
else
elog("Failed to reload #{module_reference_name}")
elog("Failed to reload #{module_fullname}")
return nil
end