From ef866c49f93aa7e24121a98f24fa8cab03a845fe 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 c4358d65421..44e5bb615f5 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -931,6 +931,13 @@ void RGWHTTPManager::manage_pending_requests() std::unique_lock 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); @@ -955,13 +962,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