@@ -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 } "
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
+ if ! module_metadata . path || ! ::File . exist? ( module_metadata . path )
76
91
next
77
92
end
78
93
@@ -91,15 +106,41 @@ def get_unchanged_module_references
91
106
private
92
107
#######
93
108
109
+ def remove_from_cache ( module_name )
110
+ @module_metadata_cache . each do |cache_key , module_metadata |
111
+
112
+ if module_metadata . ref_name . eql? module_name
113
+ @module_metadata_cache . delete cache_key
114
+ return true
115
+ end
116
+ end
117
+
118
+ return false
119
+ end
120
+
94
121
def wait_for_load
95
122
@load_thread . join unless @store_loaded
96
123
end
97
124
98
125
def refresh_metadata_instance_internal ( module_instance )
99
126
metadata_obj = Obj . new ( module_instance )
127
+ purge_duplicate ( metadata_obj )
100
128
@module_metadata_cache [ get_cache_key ( module_instance ) ] = metadata_obj
101
129
end
102
130
131
+ #
132
+ # Remove all instances of modules pointing to the same path. This prevents stale data hanging
133
+ # around when modules are incorrectly typed (eg: Auxilary that should be Exploit)
134
+ #
135
+ def purge_duplicate ( metadata_obj )
136
+ @module_metadata_cache . each do |cache_key , module_metadata |
137
+
138
+ if module_metadata . path . eql? metadata_obj . path
139
+ @module_metadata_cache . delete cache_key
140
+ end
141
+ end
142
+ end
143
+
103
144
def get_cache_key ( module_instance )
104
145
key = ''
105
146
key << ( module_instance . type . nil? ? '' : module_instance . type )
0 commit comments