PCI: Hotplug: Fix leaks in IBM Hot Plug Controller Driver - ibmphp_init_devno()
authorJesper Juhl <jesper.juhl@gmail.com>
Fri, 21 Mar 2008 23:07:13 +0000 (00:07 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 21 Apr 2008 04:47:08 +0000 (21:47 -0700)
In drivers/pci/hotplug/ibmphp_core.c::ibmphp_init_devno() we allocate
space dynamically for a PCI irq routing table by calling
pcibios_get_irq_routing_table(), but we never free the allocated space.

This patch frees the allocated space at the function exit points.

Spotted by the Coverity checker. Compile tested only.

Please consider applying.

Signed-off-by: Jesper Juhl <jesper.juhl@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/pci/hotplug/ibmphp_core.c

index 87b6b8b..81d0092 100644 (file)
@@ -148,8 +148,10 @@ int ibmphp_init_devno(struct slot **cur_slot)
        len = (rtable->size - sizeof(struct irq_routing_table)) /
                        sizeof(struct irq_info);
 
        len = (rtable->size - sizeof(struct irq_routing_table)) /
                        sizeof(struct irq_info);
 
-       if (!len)
+       if (!len) {
+               kfree(rtable);
                return -1;
                return -1;
+       }
        for (loop = 0; loop < len; loop++) {
                if ((*cur_slot)->number == rtable->slots[loop].slot) {
                if ((*cur_slot)->bus == rtable->slots[loop].bus) {
        for (loop = 0; loop < len; loop++) {
                if ((*cur_slot)->number == rtable->slots[loop].slot) {
                if ((*cur_slot)->bus == rtable->slots[loop].bus) {
@@ -187,11 +189,13 @@ int ibmphp_init_devno(struct slot **cur_slot)
                                debug("rtable->slots[loop].irq[3].link = %x\n",
                                        rtable->slots[loop].irq[3].link);
                                debug("end of init_devno\n");
                                debug("rtable->slots[loop].irq[3].link = %x\n",
                                        rtable->slots[loop].irq[3].link);
                                debug("end of init_devno\n");
+                               kfree(rtable);
                                return 0;
                        }
                }
        }
 
                                return 0;
                        }
                }
        }
 
+       kfree(rtable);
        return -1;
 }
 
        return -1;
 }