]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls_rbd: protect against excessively large object maps 8099/head
authorJason Dillaman <dillaman@redhat.com>
Mon, 14 Mar 2016 17:57:28 +0000 (13:57 -0400)
committerJason Dillaman <dillaman@redhat.com>
Mon, 14 Mar 2016 17:57:28 +0000 (13:57 -0400)
Fixes: #15121
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/cls/rbd/cls_rbd.cc

index af1e740d915229fa0b29ff3172bb4838990ac27e..14d19f2db6d6eb51aed80ed0829328527120d326 100644 (file)
@@ -130,6 +130,7 @@ cls_method_handle_t h_mirror_image_remove;
 #define RBD_DIR_ID_KEY_PREFIX "id_"
 #define RBD_DIR_NAME_KEY_PREFIX "name_"
 #define RBD_METADATA_KEY_PREFIX "metadata_"
+#define RBD_MAX_OBJECT_MAP_OBJECT_COUNT 256000000
 
 static int snap_read_header(cls_method_context_t hctx, bufferlist& bl)
 {
@@ -2259,6 +2260,12 @@ int object_map_resize(cls_method_context_t hctx, bufferlist *in, bufferlist *out
     return -EINVAL;
   }
 
+  // protect against excessive memory requirements
+  if (object_count > RBD_MAX_OBJECT_MAP_OBJECT_COUNT) {
+    CLS_ERR("object map too large: %" PRIu64, object_count);
+    return -EINVAL;
+  }
+
   BitVector<2> object_map;
   int r = object_map_read(hctx, object_map);
   if ((r < 0) && (r != -ENOENT)) {