aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2012-01-30 12:20:13 -0500
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2012-02-29 09:10:35 -0500
commita29852be492d61001d86c6ebf5fff9b93d7b4be9 (patch)
tree0a15800a6aa30943131ead177d38bf5f7702b2f2 /drivers
parent6b21d18ed50c7d145220b0724ea7f2613abf0f95 (diff)
UBI: fix error handling in ubi_scan()
Two bad things can happen in ubi_scan(): 1. If kmem_cache_create() fails we jump to out_si and call ubi_scan_destroy_si() which calls kmem_cache_destroy(). But si->scan_leb_slab is NULL. 2. If process_eb() fails we jump to out_vidh, call kmem_cache_destroy() and ubi_scan_destroy_si() which calls again kmem_cache_destroy(). Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Cc: stable@kernel.org
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mtd/ubi/scan.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c
index 0cb17d936b5a..b99318ed51e6 100644
--- a/drivers/mtd/ubi/scan.c
+++ b/drivers/mtd/ubi/scan.c
@@ -1174,7 +1174,7 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi)
1174 1174
1175 ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); 1175 ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
1176 if (!ech) 1176 if (!ech)
1177 goto out_slab; 1177 goto out_si;
1178 1178
1179 vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); 1179 vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
1180 if (!vidh) 1180 if (!vidh)
@@ -1235,8 +1235,6 @@ out_vidh:
1235 ubi_free_vid_hdr(ubi, vidh); 1235 ubi_free_vid_hdr(ubi, vidh);
1236out_ech: 1236out_ech:
1237 kfree(ech); 1237 kfree(ech);
1238out_slab:
1239 kmem_cache_destroy(si->scan_leb_slab);
1240out_si: 1238out_si:
1241 ubi_scan_destroy_si(si); 1239 ubi_scan_destroy_si(si);
1242 return ERR_PTR(err); 1240 return ERR_PTR(err);
@@ -1325,7 +1323,9 @@ void ubi_scan_destroy_si(struct ubi_scan_info *si)
1325 } 1323 }
1326 } 1324 }
1327 1325
1328 kmem_cache_destroy(si->scan_leb_slab); 1326 if (si->scan_leb_slab)
1327 kmem_cache_destroy(si->scan_leb_slab);
1328
1329 kfree(si); 1329 kfree(si);
1330} 1330}
1331 1331