From 4de7c8d0a7222c83268d03b99015c6b9d25f124d Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 4 Aug 2016 20:40:10 -0400 Subject: [PATCH] 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 --- src/librbd/internal.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index e1ad623787d5d..f32734558033f 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;