From: David Zafman Date: Thu, 9 Aug 2018 23:11:00 +0000 (-0700) Subject: osd: Check CRC when possile in build_push_op() X-Git-Tag: v14.0.1~510^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=381da3f0417c1004c2ec0e543019d9217408664e;p=ceph.git osd: Check CRC when possile in build_push_op() Fixes: http://tracker.ceph.com/issues/25084 Signed-off-by: David Zafman --- diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 62f89eba14ef..845ebc0b3296 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -1828,6 +1828,7 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info, << dendl; eversion_t v = recovery_info.version; + object_info_t oi; if (progress.first) { int r = store->omap_get_header(ch, ghobject_t(recovery_info.soid), &out_op->omap_header); if(r < 0) { @@ -1842,7 +1843,6 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info, // Debug bufferlist bv = out_op->attrset[OI_ATTR]; - object_info_t oi; try { auto bliter = bv.cbegin(); decode(oi, bliter); @@ -1956,6 +1956,17 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info, } out_op->data.claim_append(bit); } + if (progress.first && out_op->data_included.begin().get_start() == 0 && + out_op->data.length() == oi.size && oi.is_data_digest()) { + uint32_t crc = out_op->data.crc32c(-1); + if (oi.data_digest != crc) { + dout(0) << __func__ << " " << coll << std::hex + << " full-object read crc 0x" << crc + << " != expected 0x" << oi.data_digest + << std::dec << " on " << recovery_info.soid << dendl; + return -EIO; + } + } if (new_progress.is_complete(recovery_info)) { new_progress.data_complete = true;