From: Casey Bodley Date: Tue, 4 Sep 2018 20:33:48 +0000 (-0400) Subject: rgw: RGWAsyncPutSystemObj does not access coroutine memory X-Git-Tag: v14.0.1~377^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=85396674811be8f7a25dc9d25fd2db68c93561c5;p=ceph.git rgw: RGWAsyncPutSystemObj does not access coroutine memory Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_cr_rados.cc b/src/rgw/rgw_cr_rados.cc index a83c5a99105..b9a0ab9ec8e 100644 --- a/src/rgw/rgw_cr_rados.cc +++ b/src/rgw/rgw_cr_rados.cc @@ -122,15 +122,18 @@ int RGWSimpleRadosReadAttrsCR::request_complete() int RGWAsyncPutSystemObj::_send_request() { - return store->put_system_obj_data(NULL, obj, bl, -1, exclusive, objv_tracker); + return store->put_system_obj_data(NULL, obj, bl, -1, exclusive, &objv_tracker); } RGWAsyncPutSystemObj::RGWAsyncPutSystemObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, RGWRados *_store, - RGWObjVersionTracker *_objv_tracker, rgw_raw_obj& _obj, - bool _exclusive, bufferlist& _bl) - : RGWAsyncRadosRequest(caller, cn), store(_store), objv_tracker(_objv_tracker), - obj(_obj), exclusive(_exclusive), bl(_bl) + RGWObjVersionTracker *_objv_tracker, const rgw_raw_obj& _obj, + bool _exclusive, bufferlist _bl) + : RGWAsyncRadosRequest(caller, cn), store(_store), + obj(_obj), exclusive(_exclusive), bl(std::move(_bl)) { + if (_objv_tracker) { + objv_tracker = *_objv_tracker; + } } int RGWAsyncPutSystemObjAttrs::_send_request() diff --git a/src/rgw/rgw_cr_rados.h b/src/rgw/rgw_cr_rados.h index dc6efd4f6ca..38419693503 100644 --- a/src/rgw/rgw_cr_rados.h +++ b/src/rgw/rgw_cr_rados.h @@ -122,7 +122,6 @@ public: class RGWAsyncPutSystemObj : public RGWAsyncRadosRequest { RGWRados *store; - RGWObjVersionTracker *objv_tracker; rgw_raw_obj obj; bool exclusive; bufferlist bl; @@ -131,8 +130,10 @@ protected: int _send_request() override; public: RGWAsyncPutSystemObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, RGWRados *_store, - RGWObjVersionTracker *_objv_tracker, rgw_raw_obj& _obj, - bool _exclusive, bufferlist& _bl); + RGWObjVersionTracker *_objv_tracker, const rgw_raw_obj& _obj, + bool _exclusive, bufferlist _bl); + + RGWObjVersionTracker objv_tracker; }; class RGWAsyncPutSystemObjAttrs : public RGWAsyncRadosRequest { @@ -290,10 +291,8 @@ class RGWSimpleRadosWriteCR : public RGWSimpleCoroutine { RGWAsyncRadosProcessor *async_rados; RGWRados *store; bufferlist bl; - rgw_raw_obj obj; RGWObjVersionTracker *objv_tracker; - RGWAsyncPutSystemObj *req{nullptr}; public: @@ -318,12 +317,15 @@ public: int send_request() override { req = new RGWAsyncPutSystemObj(this, stack->create_completion_notifier(), - store, objv_tracker, obj, false, bl); + store, objv_tracker, obj, false, std::move(bl)); async_rados->queue(req); return 0; } int request_complete() override { + if (objv_tracker) { // copy the updated version + *objv_tracker = req->objv_tracker; + } return req->get_ret_status(); } };