]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-nbd: disallow mapping images >2TB in size 11870/head
authorMykola Golub <mgolub@mirantis.com>
Wed, 2 Nov 2016 08:49:23 +0000 (10:49 +0200)
committerLoic Dachary <ldachary@redhat.com>
Wed, 9 Nov 2016 15:05:48 +0000 (16:05 +0100)
Fixes: http://tracker.ceph.com/issues/17219
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
(cherry picked from commit 2012b4dfc65414751e3da8386a3a14da8b7c1249)

qa/workunits/rbd/rbd-nbd.sh
src/tools/rbd_nbd/rbd-nbd.cc

index 1e08adee81fa964f936f5c9707d1b0adf6069c26..a414c4d0d641e07cbe266a820ea4120afc5e0ec3 100755 (executable)
@@ -4,6 +4,7 @@
 
 POOL=rbd
 IMAGE=testrbdnbd$$
+TOO_LARGE_IMAGE=${IMAGE}_large
 SUDO=sudo
 SIZE=64
 DATA=
@@ -16,6 +17,7 @@ setup()
     DATA=${TEMPDIR}/data
     dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
     rbd --dest-pool ${POOL} --no-progress import ${DATA} ${IMAGE}
+    rbd -p ${POOL} create ${TOO_LARGE_IMAGE} --size 3T
 
     if [ `id -u` = 0 ]
     then
@@ -38,6 +40,7 @@ function cleanup()
        done
        rbd -p ${POOL} remove ${IMAGE}
     fi
+    rbd -p ${POOL} remove ${TOO_LARGE_IMAGE}
 }
 
 function expect_false()
@@ -60,6 +63,7 @@ then
 fi
 expect_false ${SUDO} rbd-nbd map INVALIDIMAGE
 expect_false ${SUDO} rbd-nbd --device INVALIDDEV map ${IMAGE}
+expect_false ${SUDO} rbd-nbd map ${TOO_LARGE_IMAGE}
 
 # map test using the first unused device
 DEV=`${SUDO} rbd-nbd map ${POOL}/${IMAGE}`
index 49cbeecf19d1fbbb5ece0dc5ddcece199fbdd8e4..dd5ace59ffc3eb26a6474432982d199dcb4486b5 100644 (file)
@@ -582,6 +582,14 @@ static int do_map()
   }
 
   size = info.size;
+
+  if (size > (1UL << 32) * 512) {
+    r = -EFBIG;
+    cerr << "rbd-nbd: image is too large (" << prettybyte_t(size) << ", max is "
+         << prettybyte_t((1UL << 32) * 512) << ")" << std::endl;
+    goto close_nbd;
+  }
+
   r = ioctl(nbd, NBD_SET_SIZE, size);
   if (r < 0) {
     r = -errno;