From e0f90f03ddf2824b448f6affc34ed40d4cead5d2 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 26 Jan 2017 14:02:11 -0500 Subject: [PATCH] librbd: introduce new constants for tracking max block name prefix Fixes: http://tracker.ceph.com/issues/18653 Signed-off-by: Jason Dillaman (cherry picked from commit 2c08629c99d90aa7676b59263c055c9f1f577039) --- src/include/rbd_types.h | 19 +++++++++++++++++++ src/librbd/Utils.cc | 5 ++--- src/librbd/image/CreateRequest.cc | 5 +++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/include/rbd_types.h b/src/include/rbd_types.h index de7d1c6f35a8b..a8eac71538e1d 100644 --- a/src/include/rbd_types.h +++ b/src/include/rbd_types.h @@ -67,6 +67,25 @@ #define RBD_MAX_OBJ_NAME_SIZE 96 #define RBD_MAX_BLOCK_NAME_SIZE 24 +/** + * Maximum string length of the RBD v2 image id (not including + * null termination). This limit was derived from the existing + * RBD_MAX_BLOCK_NAME_SIZE limit which needs to hold the "rbd_data." + * prefix and null termination. + */ +#define RBD_MAX_IMAGE_ID_LENGTH 14 + +/** + * Maximum string length of the RBD block object name prefix (not including + * null termination). + * + * v1 format: rb... + * v2 format: rbd_data.[.] + * + * Note: new features might require increasing this maximum prefix length. + */ +#define RBD_MAX_BLOCK_NAME_PREFIX_LENGTH 43 + #define RBD_COMP_NONE 0 #define RBD_CRYPT_NONE 0 diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index 1dff4ce4b8f1d..9dcead61f63ff 100644 --- a/src/librbd/Utils.cc +++ b/src/librbd/Utils.cc @@ -56,9 +56,8 @@ std::string generate_image_id(librados::IoCtx &ioctx) { std::string 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); + if (id.length() > RBD_MAX_IMAGE_ID_LENGTH) { + id = id.substr(id.length() - RBD_MAX_IMAGE_ID_LENGTH); } return id; diff --git a/src/librbd/image/CreateRequest.cc b/src/librbd/image/CreateRequest.cc index 2a9dfac2fc1f2..2c10092723ede 100644 --- a/src/librbd/image/CreateRequest.cc +++ b/src/librbd/image/CreateRequest.cc @@ -443,6 +443,11 @@ void CreateRequest::create_image() { oss << stringify(m_ioctx.get_id()) << "."; } oss << m_image_id; + if (oss.str().length() > RBD_MAX_BLOCK_NAME_PREFIX_LENGTH) { + lderr(m_cct) << "object prefix '" << oss.str() << "' too large" << dendl; + complete(-EINVAL); + return; + } librados::ObjectWriteOperation op; op.create(true); -- 2.39.5