From d09da2fc35cf06fe75000682f303f40fca617a78 Mon Sep 17 00:00:00 2001 From: Yuval Lifshitz Date: Fri, 2 Jul 2021 16:12:33 +0300 Subject: [PATCH] rgw/notifications: cache object size to avoid accessing invalid memoery Fixes: https://tracker.ceph.com/issues/51347 Signed-off-by: Yuval Lifshitz (cherry picked from commit fc42652ff24828d029349c2c101015d2fdb4825a) Conflicts: src/rgw/rgw_op.cc --- src/rgw/rgw_op.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index cd05f8ab8dbe..bf1717781fd1 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -5231,7 +5231,8 @@ void RGWCopyObj::execute(optional_yield y) encode_delete_at_attr(delete_at, attrs); - if (!s->system_request) { // no quota enforcement for system requests + uint64_t obj_size = 0; + { // get src object size (cached in obj_ctx from verify_permission()) RGWObjState* astate = nullptr; op_ret = src_object->get_obj_state(this, s->obj_ctx, *src_bucket, &astate, @@ -5239,11 +5240,15 @@ void RGWCopyObj::execute(optional_yield y) if (op_ret < 0) { return; } - // enforce quota against the destination bucket owner - op_ret = dest_bucket->check_quota(user_quota, bucket_quota, + obj_size = astate->size; + + if (!s->system_request) { // no quota enforcement for system requests + // enforce quota against the destination bucket owner + op_ret = dest_bucket->check_quota(user_quota, bucket_quota, astate->accounted_size, y); - if (op_ret < 0) { - return; + if (op_ret < 0) { + return; + } } } @@ -5286,7 +5291,7 @@ void RGWCopyObj::execute(optional_yield y) s->yield); // send request to notification manager - const auto ret = rgw::notify::publish_commit(s->object.get(), s->obj_size, mtime, etag, event_type, res, this); + const auto ret = rgw::notify::publish_commit(s->object.get(), obj_size, mtime, etag, event_type, res, this); if (ret < 0) { ldpp_dout(this, 1) << "ERROR: publishing notification failed, with error: " << ret << dendl; // too late to rollback operation, hence op_ret is not set here -- 2.47.3