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: v0.94.10~37^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F10987%2Fhead;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 (cherry picked from commit 4de7c8d0a7222c83268d03b99015c6b9d25f124d) --- 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;