]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Empty reqs_change_state queue before unregistered_reqs 36650/head
authorSoumya Koduri <skoduri@redhat.com>
Tue, 16 Jun 2020 12:40:08 +0000 (18:10 +0530)
committerNathan Cutler <ncutler@suse.com>
Sat, 15 Aug 2020 13:04:32 +0000 (15:04 +0200)
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>
(cherry picked from commit b210437e5f28d53e770dd6938ce3c4be443da055)

src/rgw/rgw_http_client.cc

index c4358d65421f491f060becdd003f6d830f33b651..44e5bb615f5c0b859c75aa6b1090e6e3057ca04a 100644 (file)
@@ -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;