]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Empty reqs_change_state queue before unregistered_reqs 37461/head
authorSoumya Koduri <skoduri@redhat.com>
Tue, 16 Jun 2020 12:40:08 +0000 (18:10 +0530)
committerNathan Cutler <ncutler@suse.com>
Tue, 29 Sep 2020 15:54:28 +0000 (17:54 +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 dfa5d87524aa9bfc61f5abfafe81ddc432010abc..18f7a4ad43a0d70c445fc8d1908663e1e6e90688 100644 (file)
@@ -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;