stifb: check fb_alloc_cmap return value and handle failure properly

Signed-off-by: Andres Salomon <dilinger@debian.org>
Acked-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Andres Salomon 2009-03-31 15:25:26 -07:00 committed by Linus Torvalds
parent c23124277e
commit 175b39fb7e

View File

@ -1262,24 +1262,25 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
info->flags = FBINFO_DEFAULT; info->flags = FBINFO_DEFAULT;
info->pseudo_palette = &fb->pseudo_palette; info->pseudo_palette = &fb->pseudo_palette;
/* This has to been done !!! */ /* This has to be done !!! */
fb_alloc_cmap(&info->cmap, NR_PALETTE, 0); if (fb_alloc_cmap(&info->cmap, NR_PALETTE, 0))
goto out_err1;
stifb_init_display(fb); stifb_init_display(fb);
if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) { if (!request_mem_region(fix->smem_start, fix->smem_len, "stifb fb")) {
printk(KERN_ERR "stifb: cannot reserve fb region 0x%04lx-0x%04lx\n", printk(KERN_ERR "stifb: cannot reserve fb region 0x%04lx-0x%04lx\n",
fix->smem_start, fix->smem_start+fix->smem_len); fix->smem_start, fix->smem_start+fix->smem_len);
goto out_err1; goto out_err2;
} }
if (!request_mem_region(fix->mmio_start, fix->mmio_len, "stifb mmio")) { if (!request_mem_region(fix->mmio_start, fix->mmio_len, "stifb mmio")) {
printk(KERN_ERR "stifb: cannot reserve sti mmio region 0x%04lx-0x%04lx\n", printk(KERN_ERR "stifb: cannot reserve sti mmio region 0x%04lx-0x%04lx\n",
fix->mmio_start, fix->mmio_start+fix->mmio_len); fix->mmio_start, fix->mmio_start+fix->mmio_len);
goto out_err2; goto out_err3;
} }
if (register_framebuffer(&fb->info) < 0) if (register_framebuffer(&fb->info) < 0)
goto out_err3; goto out_err4;
sti->info = info; /* save for unregister_framebuffer() */ sti->info = info; /* save for unregister_framebuffer() */
@ -1297,13 +1298,14 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
return 0; return 0;
out_err3: out_err4:
release_mem_region(fix->mmio_start, fix->mmio_len); release_mem_region(fix->mmio_start, fix->mmio_len);
out_err2: out_err3:
release_mem_region(fix->smem_start, fix->smem_len); release_mem_region(fix->smem_start, fix->smem_len);
out_err2:
fb_dealloc_cmap(&info->cmap);
out_err1: out_err1:
iounmap(info->screen_base); iounmap(info->screen_base);
fb_dealloc_cmap(&info->cmap);
out_err0: out_err0:
kfree(fb); kfree(fb);
return -ENXIO; return -ENXIO;