Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nbd: validate the block size in nbd_set_size

Move the validation of the block from the callers into nbd_set_size.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Christoph Hellwig and committed by
Jens Axboe
dcbddf54 2dc691cc

+15 -32
+15 -32
drivers/block/nbd.c
··· 296 296 } 297 297 } 298 298 299 - static void nbd_set_size(struct nbd_device *nbd, loff_t bytesize, 299 + static int nbd_set_size(struct nbd_device *nbd, loff_t bytesize, 300 300 loff_t blksize) 301 301 { 302 302 struct block_device *bdev; 303 + 304 + if (!blksize) 305 + blksize = NBD_DEF_BLKSIZE; 306 + if (blksize < 512 || blksize > PAGE_SIZE || !is_power_of_2(blksize)) 307 + return -EINVAL; 303 308 304 309 nbd->config->bytesize = bytesize; 305 310 nbd->config->blksize = blksize; 306 311 307 312 if (!nbd->task_recv) 308 - return; 313 + return 0; 309 314 310 315 if (nbd->config->flags & NBD_FLAG_SEND_TRIM) { 311 316 nbd->disk->queue->limits.discard_granularity = blksize; ··· 330 325 bdput(bdev); 331 326 } 332 327 kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE); 328 + return 0; 333 329 } 334 330 335 331 static void nbd_complete_rq(struct request *req) ··· 1310 1304 args->index = i; 1311 1305 queue_work(nbd->recv_workq, &args->work); 1312 1306 } 1313 - nbd_set_size(nbd, config->bytesize, config->blksize); 1314 - return error; 1307 + return nbd_set_size(nbd, config->bytesize, config->blksize); 1315 1308 } 1316 1309 1317 1310 static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *bdev) ··· 1352 1347 nbd_config_put(nbd); 1353 1348 } 1354 1349 1355 - static bool nbd_is_valid_blksize(unsigned long blksize) 1356 - { 1357 - if (!blksize || !is_power_of_2(blksize) || blksize < 512 || 1358 - blksize > PAGE_SIZE) 1359 - return false; 1360 - return true; 1361 - } 1362 - 1363 1350 static void nbd_set_cmd_timeout(struct nbd_device *nbd, u64 timeout) 1364 1351 { 1365 1352 nbd->tag_set.timeout = timeout * HZ; ··· 1376 1379 case NBD_SET_SOCK: 1377 1380 return nbd_add_socket(nbd, arg, false); 1378 1381 case NBD_SET_BLKSIZE: 1379 - if (!arg) 1380 - arg = NBD_DEF_BLKSIZE; 1381 - if (!nbd_is_valid_blksize(arg)) 1382 - return -EINVAL; 1383 - nbd_set_size(nbd, config->bytesize, arg); 1384 - return 0; 1382 + return nbd_set_size(nbd, config->bytesize, arg); 1385 1383 case NBD_SET_SIZE: 1386 - nbd_set_size(nbd, arg, config->blksize); 1387 - return 0; 1384 + return nbd_set_size(nbd, arg, config->blksize); 1388 1385 case NBD_SET_SIZE_BLOCKS: 1389 - nbd_set_size(nbd, arg * config->blksize, 1390 - config->blksize); 1391 - return 0; 1386 + return nbd_set_size(nbd, arg * config->blksize, 1387 + config->blksize); 1392 1388 case NBD_SET_TIMEOUT: 1393 1389 nbd_set_cmd_timeout(nbd, arg); 1394 1390 return 0; ··· 1799 1809 if (info->attrs[NBD_ATTR_SIZE_BYTES]) 1800 1810 bytes = nla_get_u64(info->attrs[NBD_ATTR_SIZE_BYTES]); 1801 1811 1802 - if (info->attrs[NBD_ATTR_BLOCK_SIZE_BYTES]) { 1812 + if (info->attrs[NBD_ATTR_BLOCK_SIZE_BYTES]) 1803 1813 bsize = nla_get_u64(info->attrs[NBD_ATTR_BLOCK_SIZE_BYTES]); 1804 - if (!bsize) 1805 - bsize = NBD_DEF_BLKSIZE; 1806 - if (!nbd_is_valid_blksize(bsize)) { 1807 - printk(KERN_ERR "Invalid block size %llu\n", bsize); 1808 - return -EINVAL; 1809 - } 1810 - } 1811 1814 1812 1815 if (bytes != config->bytesize || bsize != config->blksize) 1813 - nbd_set_size(nbd, bytes, bsize); 1816 + return nbd_set_size(nbd, bytes, bsize); 1814 1817 return 0; 1815 1818 } 1816 1819