]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
server: fix potential access violation 9647/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Sun, 12 Jun 2016 02:27:12 +0000 (10:27 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Sun, 12 Jun 2016 02:37:57 +0000 (10:37 +0800)
The mdcache->request_start() method may lose the forward race
against a slave and thus may either drop the last reference of the
passed in message or push the message into the waiting_for_finish
list for a later retry.

In either case we shall stall and exit, otherwise we'll access
violation especifally for the former case(as we drop the last
reference of "req" and it shall be destructed by now).

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/mds/Server.cc

index b799684d24288a3c9a4dcdc18141ec57b06228f2..5d7d240e9d65cbb9d4e958f2a8338077021cd647 100644 (file)
@@ -1426,15 +1426,17 @@ void Server::handle_client_request(MClientRequest *req)
 
   // register + dispatch
   MDRequestRef mdr = mdcache->request_start(req);
-  if (mdr.get()) {
-    if (session) {
-      mdr->session = session;
-      session->requests.push_back(&mdr->item_session_request);
-    }
-    if (has_completed)
-      mdr->has_completed = true;
+  if (!mdr.get())
+    return;
+
+  if (session) {
+    mdr->session = session;
+    session->requests.push_back(&mdr->item_session_request);
   }
 
+  if (has_completed)
+    mdr->has_completed = true;
+
   // process embedded cap releases?
   //  (only if NOT replay!)
   if (!req->releases.empty() && req->get_source().is_client() && !req->is_replay()) {
@@ -1446,8 +1448,7 @@ void Server::handle_client_request(MClientRequest *req)
     req->releases.clear();
   }
 
-  if (mdr.get())
-    dispatch_client_request(mdr);
+  dispatch_client_request(mdr);
   return;
 }