]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Empty reqs_change_state queue before unregistered_reqs 35597/head
authorSoumya Koduri <skoduri@redhat.com>
Tue, 16 Jun 2020 12:40:08 +0000 (18:10 +0530)
committerSoumya Koduri <skoduri@redhat.com>
Tue, 16 Jun 2020 12:46:19 +0000 (18:16 +0530)
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 <skoduri@redhat.com>
src/rgw/rgw_http_client.cc

index 0d3d7a427759e66b9cbaa3f98d944f415c69f517..623cf4c53c389f2f0625cc57bf2fde468c4631d8 100644 (file)
@@ -941,6 +941,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);
@@ -965,13 +972,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;