From: "Randy.Dunlap" <rddunlap@osdl.org>

From: Leann Ogasawara <ogasawara@osdl.org>

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;

_