summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2008-08-23 15:34:31 +0000
committerimp <imp@FreeBSD.org>2008-08-23 15:34:31 +0000
commit4115689c51a0db36e3f4b7615b9d213332f09b47 (patch)
tree47e0c0d195a0f372c104b0233c9dbabe67590fa0
parent4e44ebfd93eaa0026cce623f4752ca50f8ef739c (diff)
downloadFreeBSD-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.c7
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);
}
OpenPOWER on IntegriCloud