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
This commit is contained in:
Richard Weinberger 2012-01-30 18:20:13 +01:00 committed by Artem Bityutskiy
parent 6b21d18ed5
commit a29852be49

View file

@ -1174,7 +1174,7 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi)
ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL); ech = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
if (!ech) if (!ech)
goto out_slab; goto out_si;
vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL); vidh = ubi_zalloc_vid_hdr(ubi, GFP_KERNEL);
if (!vidh) if (!vidh)
@ -1235,8 +1235,6 @@ struct ubi_scan_info *ubi_scan(struct ubi_device *ubi)
ubi_free_vid_hdr(ubi, vidh); ubi_free_vid_hdr(ubi, vidh);
out_ech: out_ech:
kfree(ech); kfree(ech);
out_slab:
kmem_cache_destroy(si->scan_leb_slab);
out_si: out_si:
ubi_scan_destroy_si(si); ubi_scan_destroy_si(si);
return ERR_PTR(err); return ERR_PTR(err);
@ -1325,7 +1323,9 @@ void ubi_scan_destroy_si(struct ubi_scan_info *si)
} }
} }
kmem_cache_destroy(si->scan_leb_slab); if (si->scan_leb_slab)
kmem_cache_destroy(si->scan_leb_slab);
kfree(si); kfree(si);
} }