diff options
author | imp <imp@FreeBSD.org> | 2008-08-23 15:34:31 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2008-08-23 15:34:31 +0000 |
commit | 4115689c51a0db36e3f4b7615b9d213332f09b47 (patch) | |
tree | 47e0c0d195a0f372c104b0233c9dbabe67590fa0 | |
parent | 4e44ebfd93eaa0026cce623f4752ca50f8ef739c (diff) | |
download | FreeBSD-src-4115689c51a0db36e3f4b7615b9d213332f09b47.zip FreeBSD-src-4115689c51a0db36e3f4b7615b9d213332f09b47.tar.gz |
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.
-rw-r--r-- | sys/dev/sis/if_sis.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/dev/sis/if_sis.c b/sys/dev/sis/if_sis.c index e5292eb..90cd430 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); } |