]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: RGWAsyncPutSystemObjAttrs does not access coroutine memory 24231/head
authorCasey Bodley <cbodley@redhat.com>
Tue, 4 Sep 2018 20:50:22 +0000 (16:50 -0400)
committerPrashant D <pdhange@redhat.com>
Mon, 24 Sep 2018 00:46:14 +0000 (20:46 -0400)
also exposes optional objv_tracker to RGWSimpleRadosWriteAttrsCR

Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit b01b3952db4c45feb98dbc7e224ca1982c224c72)

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

index 37cd1ea0c22931cf43f7a6c72a20ece09686b540..410cbfb48b1d2d1d2667c6cac658ae2a7d6406a7 100644 (file)
@@ -138,14 +138,14 @@ RGWAsyncPutSystemObj::RGWAsyncPutSystemObj(RGWCoroutine *caller, RGWAioCompletio
 
 int RGWAsyncPutSystemObjAttrs::_send_request()
 {
-  return store->system_obj_set_attrs(NULL, obj, *attrs, NULL, objv_tracker);
+  return store->system_obj_set_attrs(nullptr, obj, attrs, nullptr, &objv_tracker);
 }
 
 RGWAsyncPutSystemObjAttrs::RGWAsyncPutSystemObjAttrs(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, RGWRados *_store,
                      RGWObjVersionTracker *_objv_tracker, const rgw_raw_obj& _obj,
-                     map<string, bufferlist> *_attrs) : RGWAsyncRadosRequest(caller, cn), store(_store),
-                                                       objv_tracker(_objv_tracker), obj(_obj),
-                                                       attrs(_attrs)
+                     map<string, bufferlist> _attrs)
+  : RGWAsyncRadosRequest(caller, cn), store(_store),
+    obj(_obj), attrs(std::move(_attrs))
 {
 }
 
index a588b86f64a652514b521e03c30b29b065998536..f26d59881c716ce0c4cdf8ae25922dc980520f58 100644 (file)
@@ -138,16 +138,17 @@ public:
 
 class RGWAsyncPutSystemObjAttrs : public RGWAsyncRadosRequest {
   RGWRados *store;
-  RGWObjVersionTracker *objv_tracker;
   rgw_raw_obj obj;
-  map<string, bufferlist> *attrs;
+  map<string, bufferlist> attrs;
 
 protected:
   int _send_request() override;
 public:
   RGWAsyncPutSystemObjAttrs(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, RGWRados *_store,
                        RGWObjVersionTracker *_objv_tracker, const rgw_raw_obj& _obj,
-                       map<string, bufferlist> *_attrs);
+                       map<string, bufferlist> _attrs);
+
+  RGWObjVersionTracker objv_tracker;
 };
 
 class RGWAsyncLockSystemObj : public RGWAsyncRadosRequest {
@@ -333,21 +334,19 @@ public:
 class RGWSimpleRadosWriteAttrsCR : public RGWSimpleCoroutine {
   RGWAsyncRadosProcessor *async_rados;
   RGWRados *store;
-
+  RGWObjVersionTracker *objv_tracker;
   rgw_raw_obj obj;
-
   map<string, bufferlist> attrs;
-
-  RGWAsyncPutSystemObjAttrs *req;
+  RGWAsyncPutSystemObjAttrs *req = nullptr;
 
 public:
-  RGWSimpleRadosWriteAttrsCR(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
-                     const rgw_raw_obj& _obj,
-                     map<string, bufferlist>& _attrs) : RGWSimpleCoroutine(_store->ctx()),
-                                                async_rados(_async_rados),
-                                               store(_store),
-                                               obj(_obj),
-                                                attrs(_attrs), req(NULL) {
+  RGWSimpleRadosWriteAttrsCR(RGWAsyncRadosProcessor *_async_rados,
+                             RGWRados *_store, const rgw_raw_obj& _obj,
+                             map<string, bufferlist> _attrs,
+                             RGWObjVersionTracker *objv_tracker = nullptr)
+    : RGWSimpleCoroutine(_store->ctx()), async_rados(_async_rados),
+      store(_store), objv_tracker(objv_tracker), obj(_obj),
+      attrs(std::move(_attrs)) {
   }
   ~RGWSimpleRadosWriteAttrsCR() override {
     request_cleanup();
@@ -362,12 +361,15 @@ public:
 
   int send_request() override {
     req = new RGWAsyncPutSystemObjAttrs(this, stack->create_completion_notifier(),
-                                  store, NULL, obj, &attrs);
+                                  store, objv_tracker, obj, std::move(attrs));
     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();
   }
 };