From: Jason Dillaman Date: Fri, 5 Aug 2016 00:40:10 +0000 (-0400) Subject: librbd: prevent creation of v2 image ids that are too large X-Git-Tag: ses5-milestone5~201^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4de7c8d0a7222c83268d03b99015c6b9d25f124d;p=ceph.git librbd: prevent creation of v2 image ids that are too large The librbd API is capped at 24 characters for expressing the object prefix for data blocks (including trailing null byte). Fixes: http://tracker.ceph.com/issues/16887 Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index e1ad623787d5..f32734558033 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1143,6 +1143,14 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, extra = rand() % 0xFFFFFFFF; bid_ss << std::hex << bid << std::hex << extra; id = bid_ss.str(); + + // ensure the image id won't overflow the fixed block name size + const size_t max_id_length = RBD_MAX_BLOCK_NAME_SIZE - + strlen(RBD_DATA_PREFIX) - 1; + if (id.length() > max_id_length) { + id = id.substr(id.length() - max_id_length); + } + r = cls_client::set_id(&io_ctx, id_obj, id); if (r < 0) { lderr(cct) << "error setting image id: " << cpp_strerror(r) << dendl;