From a3525891138a21db51c17484379bbec85513d0bb Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 30 Dec 2011 12:19:32 -0800 Subject: [PATCH] osd: return EINVAL if multi op specified with no src object name This avoids crashing later in do_osd_ops() with something like osd/ReplicatedPG.cc: In function 'int ReplicatedPG::do_osd_ops(ReplicatedPG::OpContext*, std::vector >&, ceph::bufferlist&)', in thread '7f27e2d7e700' osd/ReplicatedPG.cc: 1386: FAILED assert(src_obc) Signed-off-by: Sage Weil --- src/osd/ReplicatedPG.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 91e0863626c33..54c4cccfdbc31 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -566,10 +566,12 @@ void ReplicatedPG::do_op(MOSDOp *op) map src_obc; for (vector::iterator p = op->ops.begin(); p != op->ops.end(); p++) { OSDOp& osd_op = *p; - object_locator_t src_oloc; - get_src_oloc(op->get_oid(), op->get_object_locator(), src_oloc); - hobject_t toid(osd_op.soid, src_oloc.key, op->get_pg().ps()); + if (!ceph_osd_op_type_multi(osd_op.op.op)) + continue; if (osd_op.soid.oid.name.length()) { + object_locator_t src_oloc; + get_src_oloc(op->get_oid(), op->get_object_locator(), src_oloc); + hobject_t toid(osd_op.soid, src_oloc.key, op->get_pg().ps()); if (!src_obc.count(toid)) { ObjectContext *sobc; snapid_t ssnapid; @@ -609,7 +611,9 @@ void ReplicatedPG::do_op(MOSDOp *op) } // Error cleanup below } else { - continue; + dout(10) << "no src oid specified for multi op " << osd_op << dendl; + osd->reply_op_error(op, -EINVAL); + op->put(); } put_object_contexts(src_obc); put_object_context(obc); -- 2.39.5