[PATCH 14/26] ramdisk: validate exported sector size

Ahmad Fatoum a.fatoum at barebox.org
Fri Jun 26 01:42:25 PDT 2026


ramdisk_init() currently accepts arbitrary sector sizes, including
sizes smaller than 512 bytes and non-power-of-two.

Make use of the new block_size_bits() to trigger an error message when
this occurs and while at it, also fix the memory leaks if the function
fails.

Signed-off-by: Ahmad Fatoum <a.fatoum at barebox.org>
---
 drivers/block/ramdisk.c | 36 ++++++++++++++++++++++++++----------
 1 file changed, 26 insertions(+), 10 deletions(-)

diff --git a/drivers/block/ramdisk.c b/drivers/block/ramdisk.c
index 6f3c9348058a..f6f1c4cda963 100644
--- a/drivers/block/ramdisk.c
+++ b/drivers/block/ramdisk.c
@@ -3,12 +3,12 @@
 
 #include <ramdisk.h>
 #include <block.h>
+#include <disks.h>
 #include <driver.h>
 #include <fs.h>
 #include <string.h>
 #include <xfuncs.h>
 #include <linux/align.h>
-#include <linux/log2.h>
 
 struct ramdisk {
 	struct block_device blk;
@@ -101,39 +101,55 @@ static struct cdev_operations ramdisk_ops = {
 
 struct ramdisk *ramdisk_init(int sector_size)
 {
+	struct device *dev;
 	struct ramdisk *ramdisk;
 	struct block_device *blk;
-	int ret;
+	int blockbits, ret;
+
 
 	ramdisk = xzalloc(sizeof(*ramdisk));
+	dev = &ramdisk->dev;
 
-	dev_set_name(&ramdisk->dev, "ramdisk");
-	ramdisk->dev.id = DEVICE_ID_DYNAMIC;
+	dev_set_name(dev, "ramdisk");
+	dev->id = DEVICE_ID_DYNAMIC;
 
-	ret = register_device(&ramdisk->dev);
+	ret = register_device(dev);
 	if (ret)
-		return NULL;
+		goto free_ramdisk;
+
+	blockbits = block_size_bits(dev, sector_size);
+	if (blockbits < 0)
+		goto unregister_device;
 
 	blk = &ramdisk->blk;
-	blk->dev = &ramdisk->dev;
+	blk->dev = dev;
 	blk->type = BLK_TYPE_VIRTUAL;
 
 	blk->cdev.size = 0;
-	blk->cdev.name = xstrdup(dev_name(&ramdisk->dev));
+	blk->cdev.name = xstrdup(dev_name(dev));
 	blk->cdev.dev = blk->dev;
 	blk->cdev.ops = &ramdisk_ops;
 	blk->cdev.priv = ramdisk;
 	blk->cdev.flags |= DEVFS_IS_BLOCK_DEV;
-	blk->blockbits = ilog2(sector_size);
+	blk->blockbits = blockbits;
 
 	ret = devfs_create(&blk->cdev);
 	if (ret)
-		return NULL;
+		goto free_cdev_name;
 
 	INIT_LIST_HEAD(&blk->buffered_blocks);
 	INIT_LIST_HEAD(&blk->idle_blocks);
 
 	return ramdisk;
+
+free_cdev_name:
+	free(blk->cdev.name);
+unregister_device:
+	unregister_device(dev);
+free_ramdisk:
+	free(ramdisk);
+
+	return NULL;
 }
 
 struct block_device *ramdisk_get_block_device(struct ramdisk *ramdisk)
-- 
2.47.3




More information about the barebox mailing list