From 6c0b2b4ceba188397d5877a602b0e1996d29a4eb 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 f4b110eea8ce..7bd9e665aa51 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1029,6 +1029,14 @@ reprotect_and_return_err: 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.47.3