Browse Source

mtd: nandsim: fix double free

Do not call free_device() in init_nandsim, the caller - ns_init_module -
will take care of that if something goes wrong.

Signed-off-by: Sheng Yong <shengyong1@huawei.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
shengyong 10 năm trước cách đây
mục cha
commit
5891a8d11f
1 tập tin đã thay đổi với 7 bổ sung18 xóa
  1. 7 18
      drivers/mtd/nand/nandsim.c

+ 7 - 18
drivers/mtd/nand/nandsim.c

@@ -730,8 +730,7 @@ static int init_nandsim(struct mtd_info *mtd)
 	/* Fill the partition_info structure */
 	/* Fill the partition_info structure */
 	if (parts_num > ARRAY_SIZE(ns->partitions)) {
 	if (parts_num > ARRAY_SIZE(ns->partitions)) {
 		NS_ERR("too many partitions.\n");
 		NS_ERR("too many partitions.\n");
-		ret = -EINVAL;
-		goto error;
+		return -EINVAL;
 	}
 	}
 	remains = ns->geom.totsz;
 	remains = ns->geom.totsz;
 	next_offset = 0;
 	next_offset = 0;
@@ -740,14 +739,12 @@ static int init_nandsim(struct mtd_info *mtd)
 
 
 		if (!part_sz || part_sz > remains) {
 		if (!part_sz || part_sz > remains) {
 			NS_ERR("bad partition size.\n");
 			NS_ERR("bad partition size.\n");
-			ret = -EINVAL;
-			goto error;
+			return -EINVAL;
 		}
 		}
 		ns->partitions[i].name   = get_partition_name(i);
 		ns->partitions[i].name   = get_partition_name(i);
 		if (!ns->partitions[i].name) {
 		if (!ns->partitions[i].name) {
 			NS_ERR("unable to allocate memory.\n");
 			NS_ERR("unable to allocate memory.\n");
-			ret = -ENOMEM;
-			goto error;
+			return -ENOMEM;
 		}
 		}
 		ns->partitions[i].offset = next_offset;
 		ns->partitions[i].offset = next_offset;
 		ns->partitions[i].size   = part_sz;
 		ns->partitions[i].size   = part_sz;
@@ -758,14 +755,12 @@ static int init_nandsim(struct mtd_info *mtd)
 	if (remains) {
 	if (remains) {
 		if (parts_num + 1 > ARRAY_SIZE(ns->partitions)) {
 		if (parts_num + 1 > ARRAY_SIZE(ns->partitions)) {
 			NS_ERR("too many partitions.\n");
 			NS_ERR("too many partitions.\n");
-			ret = -EINVAL;
-			goto error;
+			return -EINVAL;
 		}
 		}
 		ns->partitions[i].name   = get_partition_name(i);
 		ns->partitions[i].name   = get_partition_name(i);
 		if (!ns->partitions[i].name) {
 		if (!ns->partitions[i].name) {
 			NS_ERR("unable to allocate memory.\n");
 			NS_ERR("unable to allocate memory.\n");
-			ret = -ENOMEM;
-			goto error;
+			return -ENOMEM;
 		}
 		}
 		ns->partitions[i].offset = next_offset;
 		ns->partitions[i].offset = next_offset;
 		ns->partitions[i].size   = remains;
 		ns->partitions[i].size   = remains;
@@ -793,24 +788,18 @@ static int init_nandsim(struct mtd_info *mtd)
 	printk("options: %#x\n",                ns->options);
 	printk("options: %#x\n",                ns->options);
 
 
 	if ((ret = alloc_device(ns)) != 0)
 	if ((ret = alloc_device(ns)) != 0)
-		goto error;
+		return ret;
 
 
 	/* Allocate / initialize the internal buffer */
 	/* Allocate / initialize the internal buffer */
 	ns->buf.byte = kmalloc(ns->geom.pgszoob, GFP_KERNEL);
 	ns->buf.byte = kmalloc(ns->geom.pgszoob, GFP_KERNEL);
 	if (!ns->buf.byte) {
 	if (!ns->buf.byte) {
 		NS_ERR("init_nandsim: unable to allocate %u bytes for the internal buffer\n",
 		NS_ERR("init_nandsim: unable to allocate %u bytes for the internal buffer\n",
 			ns->geom.pgszoob);
 			ns->geom.pgszoob);
-		ret = -ENOMEM;
-		goto error;
+		return -ENOMEM;
 	}
 	}
 	memset(ns->buf.byte, 0xFF, ns->geom.pgszoob);
 	memset(ns->buf.byte, 0xFF, ns->geom.pgszoob);
 
 
 	return 0;
 	return 0;
-
-error:
-	free_device(ns);
-
-	return ret;
 }
 }
 
 
 /*
 /*