Skip to content

Commit 15f84bc

Browse files
authored
Merge pull request rapid7#21073 from Hemang360/fix-duplicate-job
Fix duplicate handler jobs caused by stop_handler on repeated run
2 parents 042cd31 + e76c21d commit 15f84bc

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

lib/msf/core/handler/reverse_http.rb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,11 +239,13 @@ def setup_handler
239239
self.service.server_name = datastore['HttpServerName']
240240

241241
# Add the new resource
242-
service.add_resource((luri + "/").gsub("//", "/"),
242+
resource_path = (luri + "/").gsub("//", "/")
243+
service.add_resource(resource_path,
243244
'Proc' => Proc.new { |cli, req|
244245
on_request(cli, req)
245246
},
246247
'VirtualDirectory' => true)
248+
self.resource_added = true
247249

248250
print_status("Started #{scheme.upcase} reverse handler on #{listener_uri(local_addr)}")
249251
lookup_proxy_settings
@@ -259,13 +261,17 @@ def setup_handler
259261
#
260262
def stop_handler
261263
if self.service
262-
self.service.remove_resource((luri + "/").gsub("//", "/"))
264+
if self.resource_added
265+
self.service.remove_resource((luri + "/").gsub("//", "/"))
266+
self.resource_added = false
267+
end
263268
self.service.deref
264269
self.service = nil
265270
end
266271
end
267272

268273
attr_accessor :service # :nodoc:
274+
attr_accessor :resource_added # :nodoc:
269275

270276
protected
271277

spec/lib/msf/core/handler/reverse_http_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,40 @@ def ssl?
3232

3333
end
3434

35+
describe '#stop_handler' do
36+
let(:mock_service) { double('service') }
37+
let(:payload) { create_payload }
38+
39+
context 'when add_resource raised and resource was not added' do
40+
before do
41+
payload.service = mock_service
42+
payload.resource_added = false
43+
end
44+
45+
it 'does not remove the resource but still derefs the service' do
46+
expect(mock_service).not_to receive(:remove_resource)
47+
expect(mock_service).to receive(:deref)
48+
payload.stop_handler
49+
expect(payload.service).to be_nil
50+
end
51+
end
52+
53+
context 'when the resource was successfully added' do
54+
before do
55+
payload.service = mock_service
56+
payload.resource_added = true
57+
end
58+
59+
it 'removes the resource and derefs the service' do
60+
expect(mock_service).to receive(:remove_resource).with('/')
61+
expect(mock_service).to receive(:deref)
62+
payload.stop_handler
63+
expect(payload.service).to be_nil
64+
expect(payload.resource_added).to eq(false)
65+
end
66+
end
67+
end
68+
3569
describe '#luri' do
3670
subject(:luri) do
3771
create_payload.luri

0 commit comments

Comments
 (0)