
From: Hollis Blanchard <hollis@austin.ibm.com>

Fix two pnp error-path memory leaks, caught by Stanford memory leak checker
circa 2.5.48.



 25-akpm/drivers/pnp/isapnp/core.c |    7 ++++---
 25-akpm/drivers/pnp/quirks.c      |    6 +++++-
 2 files changed, 9 insertions(+), 4 deletions(-)

diff -puN drivers/pnp/isapnp/core.c~pnp-memory-leaks drivers/pnp/isapnp/core.c
--- 25/drivers/pnp/isapnp/core.c~pnp-memory-leaks	Fri May 23 13:34:02 2003
+++ 25-akpm/drivers/pnp/isapnp/core.c	Fri May 23 13:34:02 2003
@@ -419,11 +419,12 @@ static void __init isapnp_skip_bytes(int
 
 static void isapnp_parse_id(struct pnp_dev * dev, unsigned short vendor, unsigned short device)
 {
-	struct pnp_id * id = isapnp_alloc(sizeof(struct pnp_id));
-	if (!id)
-		return;
+	struct pnp_id * id;
 	if (!dev)
 		return;
+	id = isapnp_alloc(sizeof(struct pnp_id));
+	if (!id)
+		return;
 	sprintf(id->id, "%c%c%c%x%x%x%x",
 			'A' + ((vendor >> 2) & 0x3f) - 1,
 			'A' + (((vendor & 3) << 3) | ((vendor >> 13) & 7)) - 1,
diff -puN drivers/pnp/quirks.c~pnp-memory-leaks drivers/pnp/quirks.c
--- 25/drivers/pnp/quirks.c~pnp-memory-leaks	Fri May 23 13:34:02 2003
+++ 25-akpm/drivers/pnp/quirks.c	Fri May 23 13:34:02 2003
@@ -39,9 +39,13 @@ static void quirk_awe32_resources(struct
 	 */
 	for ( ; res ; res = res->dep ) {
 		port2 = pnp_alloc(sizeof(struct pnp_port));
+		if (!port2)
+			return;
 		port3 = pnp_alloc(sizeof(struct pnp_port));
-		if (!port2 || !port3)
+		if (!port3) {
+			kfree(port2);
 			return;
+		}
 		port = res->port;
 		memcpy(port2, port, sizeof(struct pnp_port));
 		memcpy(port3, port, sizeof(struct pnp_port));

_
