]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: prevent creation of v2 image ids that are too large 10987/head
authorJason Dillaman <dillaman@redhat.com>
Fri, 5 Aug 2016 00:40:10 +0000 (20:40 -0400)
committerVicente Cheng <freeze.bilsted@gmail.com>
Tue, 15 Nov 2016 02:54:03 +0000 (10:54 +0800)
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 <dillaman@redhat.com>
(cherry picked from commit 4de7c8d0a7222c83268d03b99015c6b9d25f124d)

src/librbd/internal.cc

index f4b110eea8ce0c37c2780e1429cfd527f88e7882..7bd9e665aa51983312ceca318b428121560bc2f4 100644 (file)
@@ -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;