From: "Randy.Dunlap" From: Leann Ogasawara Handle kmalloc() failures --- 25-akpm/drivers/video/fbcmap.c | 28 ++++++++++++++++------------ 1 files changed, 16 insertions(+), 12 deletions(-) diff -puN drivers/video/fbcmap.c~janitor-fbcmap-kmalloc-fixes drivers/video/fbcmap.c --- 25/drivers/video/fbcmap.c~janitor-fbcmap-kmalloc-fixes Wed Feb 4 14:02:33 2004 +++ 25-akpm/drivers/video/fbcmap.c Wed Feb 4 14:04:43 2004 @@ -98,14 +98,14 @@ int fb_alloc_cmap(struct fb_cmap *cmap, if (!len) return 0; if (!(cmap->red = kmalloc(size, GFP_ATOMIC))) - return -1; + goto fail; if (!(cmap->green = kmalloc(size, GFP_ATOMIC))) - return -1; + goto fail; if (!(cmap->blue = kmalloc(size, GFP_ATOMIC))) - return -1; + goto fail; if (transp) { if (!(cmap->transp = kmalloc(size, GFP_ATOMIC))) - return -1; + goto fail; } else cmap->transp = NULL; } @@ -113,6 +113,14 @@ int fb_alloc_cmap(struct fb_cmap *cmap, cmap->len = len; fb_copy_cmap(fb_default_cmap(len), cmap, 0); return 0; + +fail: + kfree(cmap->blue); + kfree(cmap->green); + kfree(cmap->red); + cmap->red = cmap->green = cmap->blue = cmap->transp = NULL; + cmap->len = 0; + return -1; } /** @@ -126,14 +134,10 @@ int fb_alloc_cmap(struct fb_cmap *cmap, void fb_dealloc_cmap(struct fb_cmap *cmap) { - if (cmap->red) - kfree(cmap->red); - if (cmap->green) - kfree(cmap->green); - if (cmap->blue) - kfree(cmap->blue); - if (cmap->transp) - kfree(cmap->transp); + kfree(cmap->red); + kfree(cmap->green); + kfree(cmap->blue); + kfree(cmap->transp); cmap->red = cmap->green = cmap->blue = cmap->transp = NULL; cmap->len = 0; _