Merge pull request #21331 from bcoles/metadata-obj

Metadata::Obj: Deduplicate notes hash strings and memoize `Obj#path` to reduce retained memory in the module metadata cache
This commit is contained in:
adfoster-r7
2026-04-20 16:55:33 +01:00
committed by GitHub
+18 -2
View File
@@ -36,6 +36,22 @@ class Obj
@platform_list_cache[platform_string] ||= build_platform_list(platform_string)
end
# Deduplicate notes hash keys and string values via the frozen string table.
# Keys like "Stability", "SideEffects", "Reliability" repeat across thousands
# of modules; values like "crash-safe", "ioc-in-logs" repeat hundreds of times.
def dedup_notes(notes)
notes.each_with_object({}) do |(k, v), h|
h[-k] = case v
when Array
v.map { |e| e.is_a?(String) ? -e : e }
when String
-v
else
v
end
end
end
private
def build_platform_list(platform_string)
@@ -257,7 +273,7 @@ class Obj
def path
if @is_install_path
return ::File.join(Msf::Config.install_root, @path)
return @full_path ||= ::File.join(Msf::Config.install_root, @path)
end
@path
@@ -295,7 +311,7 @@ class Obj
@post_auth = obj_hash['post_auth']
@default_credential = obj_hash['default_credential']
notes = obj_hash['notes']
@notes = (notes.nil? || notes.empty?) ? EMPTY_HASH : notes
@notes = (notes.nil? || notes.empty?) ? EMPTY_HASH : Obj.dedup_notes(notes)
@needs_cleanup = obj_hash['needs_cleanup']
@session_types = obj_hash['session_types']
@autofilter_ports = obj_hash['autofilter_ports']