]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commit
client: fix access violation
authorxie xingguo <xie.xingguo@zte.com.cn>
Sat, 18 Jun 2016 00:50:04 +0000 (08:50 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Tue, 21 Jun 2016 01:36:23 +0000 (09:36 +0800)
commit660de0b235ec4dc1a8f2ab2d5f244b6cced944c7
treeae56b6380f50abc0d204933720f3e10271d5f600
parentdbb0a59c88708c532aced95909d3dca795bdfd7a
client: fix access violation

The MetaRequest is a refcounted object. On construction, it will default ref to 1.
The general process to make an MDS request will be:

  MetaRequest *req = new MetaRequest(op);
  // fill in something
  int r = make_request(req, uid, gid, target);
  return r;

As mentioned, make_request() will put the passed request before returning(and thereby
delete the request automatically).

To be more specific here, the make_request() will call "mds_requests[tid] = request->get();"
to keep the request well local tracked on entry(which raises the ref of request to 2).
And on error exit(especially for the following no reply is received case), by calling both

    unregister_request(request);
    put_request(request); // ours

, it will decrease the reference of the corresponding request to zero and thereby delete request.
Therefore the call to request thereafter is at risk of "access violation".

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