From 775c78d4bb31640a006d255ec0cb3818b6a5d23a 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 (cherry picked from commit 4de7c8d0a7222c83268d03b99015c6b9d25f124d) --- src/librbd/internal.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index d3f1cd3fb714f..9e1112c72c73e 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1048,6 +1048,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; -- 2.39.5