From: Mykola Golub Date: Wed, 2 Nov 2016 08:49:23 +0000 (+0200) Subject: rbd-nbd: disallow mapping images >2TB in size X-Git-Tag: v10.2.6~36^2~19^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=73894c5027dbcb7f358612df7e3eab924f308f17;p=ceph.git rbd-nbd: disallow mapping images >2TB in size Fixes: http://tracker.ceph.com/issues/17219 Signed-off-by: Mykola Golub (cherry picked from commit 2012b4dfc65414751e3da8386a3a14da8b7c1249) --- diff --git a/qa/workunits/rbd/rbd-nbd.sh b/qa/workunits/rbd/rbd-nbd.sh index 1e08adee81fa9..a414c4d0d641e 100755 --- a/qa/workunits/rbd/rbd-nbd.sh +++ b/qa/workunits/rbd/rbd-nbd.sh @@ -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}` diff --git a/src/tools/rbd_nbd/rbd-nbd.cc b/src/tools/rbd_nbd/rbd-nbd.cc index 49cbeecf19d1f..dd5ace59ffc3e 100644 --- a/src/tools/rbd_nbd/rbd-nbd.cc +++ b/src/tools/rbd_nbd/rbd-nbd.cc @@ -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;