From: Hollis Blanchard 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)); _