From: Ilya Dryomov Date: Tue, 19 Feb 2019 15:07:22 +0000 (+0100) Subject: librados: don't claim ObjectOperation::cmpext() buffer X-Git-Tag: v14.1.0~36^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4daddf0564dcd548ecc7c214ab9a41fc12ba71c0;p=ceph.git librados: don't claim ObjectOperation::cmpext() buffer This is counter-intuitive and doesn't match the behavior of either other compare ops (cmpxattr, omap_cmp) or write ops. Fixes: http://tracker.ceph.com/issues/38383 Signed-off-by: Ilya Dryomov --- diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index c4a87aa2697e..081ccb3e1c24 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -303,7 +303,7 @@ namespace librados //flag mean ObjectOperationFlags void set_op_flags2(int flags); - void cmpext(uint64_t off, bufferlist& cmp_bl, int *prval); + void cmpext(uint64_t off, const bufferlist& cmp_bl, int *prval); void cmpxattr(const char *name, uint8_t op, const bufferlist& val); void cmpxattr(const char *name, uint8_t op, uint64_t v); void exec(const char *cls, const char *method, bufferlist& inbl); diff --git a/src/librados/librados_cxx.cc b/src/librados/librados_cxx.cc index 601141670871..c174c7d58a79 100644 --- a/src/librados/librados_cxx.cc +++ b/src/librados/librados_cxx.cc @@ -115,11 +115,12 @@ void librados::ObjectOperation::set_op_flags2(int flags) } void librados::ObjectOperation::cmpext(uint64_t off, - bufferlist &cmp_bl, + const bufferlist &cmp_bl, int *prval) { ::ObjectOperation *o = &impl->o; - o->cmpext(off, cmp_bl, prval); + bufferlist c = cmp_bl; + o->cmpext(off, c, prval); } void librados::ObjectOperation::cmpxattr(const char *name, uint8_t op, const bufferlist& v) diff --git a/src/test/librados_test_stub/LibradosTestStub.cc b/src/test/librados_test_stub/LibradosTestStub.cc index 78a290a3ac5e..bd9a8f1860dc 100644 --- a/src/test/librados_test_stub/LibradosTestStub.cc +++ b/src/test/librados_test_stub/LibradosTestStub.cc @@ -811,7 +811,8 @@ size_t ObjectOperation::size() { return o->ops.size(); } -void ObjectOperation::cmpext(uint64_t off, bufferlist& cmp_bl, int *prval) { +void ObjectOperation::cmpext(uint64_t off, const bufferlist& cmp_bl, + int *prval) { TestObjectOperationImpl *o = reinterpret_cast(impl); ObjectOperationTestImpl op = boost::bind(&TestIoCtxImpl::cmpext, _1, _2, off, cmp_bl); if (prval != NULL) {