From: Soumya Koduri Date: Tue, 16 Jun 2020 12:40:08 +0000 (+0530) Subject: rgw: Empty reqs_change_state queue before unregistered_reqs X-Git-Tag: v15.2.5~48^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ef866c49f93aa7e24121a98f24fa8cab03a845fe;p=ceph.git 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) --- diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index c4358d65421f..44e5bb615f5c 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;