]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: RGWAsyncPutSystemObj does not access coroutine memory
authorCasey Bodley <cbodley@redhat.com>
Tue, 4 Sep 2018 20:33:48 +0000 (16:33 -0400)
committerPrashant D <pdhange@redhat.com>
Mon, 24 Sep 2018 00:46:13 +0000 (20:46 -0400)
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 85396674811be8f7a25dc9d25fd2db68c93561c5)

src/rgw/rgw_cr_rados.cc
src/rgw/rgw_cr_rados.h

index 6deaffb8cdc26eaec7d05070748cb282da173f03..37cd1ea0c22931cf43f7a6c72a20ece09686b540 100644 (file)
@@ -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()
index 441381d94eac3c4fe90fbcc73a66e32ac67e6663..a588b86f64a652514b521e03c30b29b065998536 100644 (file)
@@ -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();
   }
 };