From 9bb817c20f08bfc5b4c3f362098664058022177c Mon Sep 17 00:00:00 2001 From: Soumya Koduri Date: Tue, 16 Jun 2020 18:10:08 +0530 Subject: [PATCH] rgw: Empty reqs_change_state queue before unregistered_reqs In RGWHTTPManager::manage_pending_request(), before unregistering or unlinking the http requests, empty the reqs_change_state list to avoid use after free. Signed-off-by: Soumya Koduri (cherry picked from commit b210437e5f28d53e770dd6938ce3c4be443da055) --- src/rgw/rgw_http_client.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index dfa5d87524aa..18f7a4ad43a0 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -921,6 +921,13 @@ void RGWHTTPManager::manage_pending_requests() RWLock::WLocker wl(reqs_lock); + if (!reqs_change_state.empty()) { + for (auto siter : reqs_change_state) { + _set_req_state(siter); + } + reqs_change_state.clear(); + } + if (!unregistered_reqs.empty()) { for (auto& r : unregistered_reqs) { _unlink_request(r); @@ -945,13 +952,6 @@ void RGWHTTPManager::manage_pending_requests() } } - if (!reqs_change_state.empty()) { - for (auto siter : reqs_change_state) { - _set_req_state(siter); - } - reqs_change_state.clear(); - } - for (auto piter : remove_reqs) { rgw_http_req_data *req_data = piter.first; int r = piter.second; -- 2.47.3