diff options
author | Richard Weinberger <richard@nod.at> | 2012-01-30 12:20:13 -0500 |
---|---|---|
committer | Artem Bityutskiy <artem.bityutskiy@linux.intel.com> | 2012-02-29 09:10:35 -0500 |
commit | a29852be492d61001d86c6ebf5fff9b93d7b4be9 (patch) | |
tree | 0a15800a6aa30943131ead177d38bf5f7702b2f2 /drivers | |
parent | 6b21d18ed50c7d145220b0724ea7f2613abf0f95 (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.c | 8 |
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); |
1236 | out_ech: | 1236 | out_ech: |
1237 | kfree(ech); | 1237 | kfree(ech); |
1238 | out_slab: | ||
1239 | kmem_cache_destroy(si->scan_leb_slab); | ||
1240 | out_si: | 1238 | out_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 | ||