From: xie xingguo Date: Sun, 12 Jun 2016 02:27:12 +0000 (+0800) Subject: server: fix potential access violation X-Git-Tag: v11.0.0~158^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4450fb18bb473aee8191d7954fe1e5a4206e5de9;p=ceph.git server: fix potential access violation 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 --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index b799684d2428..5d7d240e9d65 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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; }