@@ -24,6 +24,7 @@ class Cache
24
24
# Refreshes cached module metadata as well as updating the store
25
25
#
26
26
def refresh_metadata_instance ( module_instance )
27
+ dlog "Refreshing #{ module_instance . refname } of type: #{ module_instance . type } "
27
28
refresh_metadata_instance_internal ( module_instance )
28
29
update_store
29
30
end
@@ -48,8 +49,22 @@ def refresh_metadata(module_sets)
48
49
49
50
mt [ 1 ] . keys . sort . each do |mn |
50
51
next if unchanged_reference_name_set . include? mn
51
- module_instance = mt [ 1 ] . create ( mn )
52
- next if not module_instance
52
+
53
+ begin
54
+ module_instance = mt [ 1 ] . create ( mn )
55
+ rescue Exception => e
56
+ elog "Unable to create module: #{ mn } . #{ e . message } "
57
+ end
58
+
59
+ unless module_instance
60
+ wlog "Removing invalid module reference from cache: #{ mn } "
61
+ existed = remove_from_cache ( mn )
62
+ if existed
63
+ has_changes = true
64
+ end
65
+ next
66
+ end
67
+
53
68
begin
54
69
refresh_metadata_instance_internal ( module_instance )
55
70
has_changes = true
@@ -72,7 +87,7 @@ def get_unchanged_module_references
72
87
73
88
@module_metadata_cache . each_value do |module_metadata |
74
89
75
- unless module_metadata . path and ::File . exist? ( module_metadata . path )
90
+ unless module_metadata . path && ::File . exist? ( module_metadata . path )
76
91
next
77
92
end
78
93
@@ -91,12 +106,28 @@ def get_unchanged_module_references
91
106
private
92
107
#######
93
108
109
+ def remove_from_cache ( module_name )
110
+ old_cache_size = @module_metadata_cache . size
111
+ @module_metadata_cache . delete_if { |_ , module_metadata |
112
+ module_metadata . ref_name . eql? module_name
113
+ }
114
+
115
+ return old_cache_size != @module_metadata_cache . size
116
+ end
117
+
94
118
def wait_for_load
95
119
@load_thread . join unless @store_loaded
96
120
end
97
121
98
122
def refresh_metadata_instance_internal ( module_instance )
99
123
metadata_obj = Obj . new ( module_instance )
124
+
125
+ # Remove all instances of modules pointing to the same path. This prevents stale data hanging
126
+ # around when modules are incorrectly typed (eg: Auxilary that should be Exploit)
127
+ @module_metadata_cache . delete_if { |_ , module_metadata |
128
+ module_metadata . path . eql? metadata_obj . path
129
+ }
130
+
100
131
@module_metadata_cache [ get_cache_key ( module_instance ) ] = metadata_obj
101
132
end
102
133
0 commit comments