From 3106346290de7e66d8174a3cd9ee06d34e1f6668 Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Sat, 23 Aug 2008 15:34:31 +0000 Subject: [PATCH] There actually were bugs in the original handling that I missed last night. Free the children after each pci bus that is searched. Otherwise we leak them. With free in the new place, we also have to free children before going to done when we find the device we're looking for. Also, if we can't get the children of a device, just ignore that bus. --- sys/dev/sis/if_sis.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/dev/sis/if_sis.c b/sys/dev/sis/if_sis.c index e5292ebf5e3..90cd430ab68 100644 --- a/sys/dev/sis/if_sis.c +++ b/sys/dev/sis/if_sis.c @@ -347,21 +347,22 @@ sis_find_bridge(device_t dev) devclass_get_devices(pci_devclass, &pci_devices, &pci_count); for (i = 0, busp = pci_devices; i < pci_count; i++, busp++) { - pci_childcount = 0; - device_get_children(*busp, &pci_children, &pci_childcount); + if (device_get_children(*busp, &pci_children, &pci_childcount)) + continue; for (j = 0, childp = pci_children; j < pci_childcount; j++, childp++) { if (pci_get_vendor(*childp) == SIS_VENDORID && pci_get_device(*childp) == 0x0008) { child = *childp; + free(pci_children, M_TEMP); goto done; } } + free(pci_children, M_TEMP); } done: free(pci_devices, M_TEMP); - free(pci_children, M_TEMP); return(child); }