From owner-p4-projects@FreeBSD.ORG Mon Jan 15 22:55:23 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C045316A47C; Mon, 15 Jan 2007 22:55:23 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 7B72E16A412 for ; Mon, 15 Jan 2007 22:55:23 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 6B67E13C45A for ; Mon, 15 Jan 2007 22:55:23 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l0FMtNJb033420 for ; Mon, 15 Jan 2007 22:55:23 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l0FMtKId033379 for perforce@freebsd.org; Mon, 15 Jan 2007 22:55:20 GMT (envelope-from hselasky@FreeBSD.org) Date: Mon, 15 Jan 2007 22:55:20 GMT Message-Id: <200701152255.l0FMtKId033379@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 112957 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 15 Jan 2007 22:55:24 -0000 http://perforce.freebsd.org/chv.cgi?CH=112957 Change 112957 by hselasky@hselasky_mini_itx on 2007/01/15 22:54:41 Fix problems and memory leaks regarding calls to "device_get_children()". Affected files ... .. //depot/projects/usb/src/sys/amd64/pci/pci_bus.c#2 edit .. //depot/projects/usb/src/sys/compat/linsysfs/linsysfs.c#2 edit .. //depot/projects/usb/src/sys/compat/ndis/subr_ntoskrnl.c#2 edit .. //depot/projects/usb/src/sys/dev/acpica/acpi.c#3 edit .. //depot/projects/usb/src/sys/dev/acpica/acpi_pci.c#2 edit .. //depot/projects/usb/src/sys/dev/ata/ata-all.c#3 edit .. //depot/projects/usb/src/sys/dev/ata/ata-cbus.c#2 edit .. //depot/projects/usb/src/sys/dev/ata/ata-chipset.c#3 edit .. //depot/projects/usb/src/sys/dev/ata/ata-disk.c#3 edit .. //depot/projects/usb/src/sys/dev/ata/ata-pci.c#2 edit .. //depot/projects/usb/src/sys/dev/ata/atapi-cam.c#2 edit .. //depot/projects/usb/src/sys/dev/cardbus/cardbus.c#3 edit .. //depot/projects/usb/src/sys/dev/cardbus/cardbus_device.c#2 edit .. //depot/projects/usb/src/sys/dev/esp/esp_sbus.c#2 edit .. //depot/projects/usb/src/sys/dev/hme/if_hme_pci.c#2 edit .. //depot/projects/usb/src/sys/dev/mii/mlphy.c#3 edit .. //depot/projects/usb/src/sys/dev/mii/tlphy.c#3 edit .. //depot/projects/usb/src/sys/dev/pccard/pccard_device.c#2 edit .. //depot/projects/usb/src/sys/dev/pccbb/pccbb.c#3 edit .. //depot/projects/usb/src/sys/dev/pci/pci.c#3 edit .. //depot/projects/usb/src/sys/dev/ppbus/ppbconf.c#2 edit .. //depot/projects/usb/src/sys/dev/ppc/ppc.c#2 edit .. //depot/projects/usb/src/sys/dev/sound/pci/csa.c#2 edit .. //depot/projects/usb/src/sys/dev/sound/pci/emu10kx.c#2 edit .. //depot/projects/usb/src/sys/dev/spibus/spibus.c#2 edit .. //depot/projects/usb/src/sys/i386/pci/pci_bus.c#2 edit .. //depot/projects/usb/src/sys/isa/isa_common.c#3 edit .. //depot/projects/usb/src/sys/kern/kern_cpu.c#2 edit .. //depot/projects/usb/src/sys/kern/subr_bus.c#3 edit .. //depot/projects/usb/src/sys/pci/agp.c#3 edit .. //depot/projects/usb/src/sys/pci/agp_i810.c#3 edit .. //depot/projects/usb/src/sys/pci/if_sis.c#3 edit .. //depot/projects/usb/src/sys/sys/bus.h#3 edit Differences ... ==== //depot/projects/usb/src/sys/amd64/pci/pci_bus.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/compat/linsysfs/linsysfs.c#2 (text) ==== @@ -214,10 +214,12 @@ } } - device_get_children(dev, &children, &nchildren); - for (i = 0; i < nchildren; i++) { + if (!device_get_children(dev, &children, &nchildren)) { + for (i = 0; i < nchildren; i++) { if (children[i]) linsysfs_run_bus(children[i], dir, scsi, new_path, prefix); + } + free(children, M_TEMP); } if (new_path != path) free(new_path, M_TEMP); ==== //depot/projects/usb/src/sys/compat/ndis/subr_ntoskrnl.c#2 (text+ko) ==== @@ -2662,22 +2662,17 @@ * level of recursion to inspect them. */ - device_get_children(dev, &children, &childcnt); - - for (i = 0; i < childcnt; i++) { + if (!device_get_children(dev, &children, &childcnt)) { + for (i = 0; i < childcnt; i++) { matching_dev = ntoskrnl_finddev(children[i], paddr, res); if (matching_dev != NULL) { free(children, M_TEMP); return(matching_dev); } + } + free(children, M_TEMP); } - - /* Won't somebody please think of the children! */ - - if (children != NULL) - free(children, M_TEMP); - return(NULL); } ==== //depot/projects/usb/src/sys/dev/acpica/acpi.c#3 (text+ko) ==== @@ -625,8 +625,8 @@ * device has an _SxD method for the next sleep state, use that power * state instead. */ - device_get_children(dev, &devlist, &numdevs); - for (i = 0; i < numdevs; i++) { + if (!device_get_children(dev, &devlist, &numdevs)) { + for (i = 0; i < numdevs; i++) { /* If the device is not attached, we've powered it down elsewhere. */ child = devlist[i]; if (!device_is_attached(child)) @@ -641,8 +641,9 @@ child, &pstate); if ((error == 0 || error == ESRCH) && acpi_do_powerstate) pci_set_powerstate(child, pstate); + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); error = 0; return (error); @@ -661,16 +662,17 @@ * Put all devices in D0 before resuming them. Call _S0D on each one * since some systems expect this. */ - device_get_children(dev, &devlist, &numdevs); - for (i = 0; i < numdevs; i++) { + if (!device_get_children(dev, &devlist, &numdevs)) { + for (i = 0; i < numdevs; i++) { child = devlist[i]; handle = acpi_get_handle(child); if (handle) AcpiEvaluateObject(handle, "_S0D", NULL, NULL); if (device_is_attached(child) && acpi_do_powerstate) pci_set_powerstate(child, PCI_POWERSTATE_D0); + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); return (bus_generic_resume(dev)); } @@ -761,16 +763,17 @@ int i, numdevs; DEVICE_IDENTIFY(driver, dev); - device_get_children(dev, &devlist, &numdevs); - for (i = 0; i < numdevs; i++) { + if (!device_get_children(dev, &devlist, &numdevs)) { + for (i = 0; i < numdevs; i++) { child = devlist[i]; if (device_get_state(child) == DS_NOTPRESENT) { /* pci_set_powerstate(child, PCI_POWERSTATE_D0); */ if (device_probe_and_attach(child) != 0) ; /* pci_set_powerstate(child, PCI_POWERSTATE_D3); */ } + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); } /* Location hint for devctl(8) */ @@ -2404,7 +2407,7 @@ error = device_get_children(dev, &devlist, &numdevs); if (error != 0 || numdevs == 0) { - if (numdevs == 0) + if (error == 0) free(devlist, M_TEMP); return (error); } ==== //depot/projects/usb/src/sys/dev/acpica/acpi_pci.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/ata/ata-all.c#3 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/ata/ata-cbus.c#2 (text+ko) ==== @@ -261,12 +261,13 @@ int count, i; /* find channel number on this controller */ - device_get_children(device_get_parent(dev), &children, &count); - for (i = 0; i < count; i++) { + if (!device_get_children(device_get_parent(dev), &children, &count)) { + for (i = 0; i < count; i++) { if (children[i] == dev) ch->unit = i; + } + free(children, M_TEMP); } - free(children, M_TEMP); /* setup the resource vectors */ for (i = ATA_DATA; i <= ATA_COMMAND; i ++) { ==== //depot/projects/usb/src/sys/dev/ata/ata-chipset.c#3 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/ata/ata-disk.c#3 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/ata/ata-pci.c#2 (text+ko) ==== @@ -539,12 +539,13 @@ bzero(ch, sizeof(struct ata_channel)); /* find channel number on this controller */ - device_get_children(device_get_parent(dev), &children, &count); - for (i = 0; i < count; i++) { + if (!device_get_children(device_get_parent(dev), &children, &count)) { + for (i = 0; i < count; i++) { if (children[i] == dev) ch->unit = i; + } + free(children, M_TEMP); } - free(children, M_TEMP); sprintf(buffer, "ATA channel %d", ch->unit); device_set_desc_copy(dev, buffer); ==== //depot/projects/usb/src/sys/dev/ata/atapi-cam.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/cardbus/cardbus.c#3 (text+ko) ==== @@ -217,7 +217,8 @@ int tmp; int err = 0; - device_get_children(cbdev, &devlist, &numdevs); + if (device_get_children(cbdev, &devlist, &numdevs)) + return ENOENT; if (numdevs == 0) { free(devlist, M_TEMP); @@ -251,7 +252,8 @@ struct cardbus_devinfo *dinfo; DEVICE_IDENTIFY(driver, cbdev); - device_get_children(cbdev, &devlist, &numdevs); + if (device_get_children(cbdev, &devlist, &numdevs)) + return; /* * If there are no drivers attached, but there are children, * then power the card up. ==== //depot/projects/usb/src/sys/dev/cardbus/cardbus_device.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/esp/esp_sbus.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/hme/if_hme_pci.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/mii/mlphy.c#3 (text+ko) ==== @@ -195,14 +195,15 @@ * See if there's another PHY on this bus with us. * If so, we may need it for 10Mbps modes. */ - device_get_children(msc->ml_mii.mii_dev, &devlist, &devs); - for (i = 0; i < devs; i++) { + if (!device_get_children(msc->ml_mii.mii_dev, &devlist, &devs)) { + for (i = 0; i < devs; i++) { if (strcmp(device_get_name(devlist[i]), "mlphy")) { other = device_get_softc(devlist[i]); break; } + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); switch (cmd) { case MII_POLLSTAT: @@ -404,14 +405,15 @@ int devs, i; /* See if there's another PHY on the bus with us. */ - device_get_children(msc->ml_mii.mii_dev, &devlist, &devs); - for (i = 0; i < devs; i++) { + if (!device_get_children(msc->ml_mii.mii_dev, &devlist, &devs)) { + for (i = 0; i < devs; i++) { if (strcmp(device_get_name(devlist[i]), "mlphy")) { other = device_get_softc(devlist[i]); break; } + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); if (other == NULL) return; ==== //depot/projects/usb/src/sys/dev/mii/tlphy.c#3 (text+ko) ==== @@ -168,15 +168,16 @@ device_t *devlist; int devs, i; - device_get_children(sc->sc_mii.mii_dev, &devlist, &devs); - for (i = 0; i < devs; i++) { + if (!device_get_children(sc->sc_mii.mii_dev, &devlist, &devs)) { + for (i = 0; i < devs; i++) { if (strcmp(device_get_name(devlist[i]), "tlphy")) { other = device_get_softc(devlist[i]); capmask &= ~other->mii_capabilities; break; } + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); } mii->mii_instance++; ==== //depot/projects/usb/src/sys/dev/pccard/pccard_device.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/pccbb/pccbb.c#3 (text+ko) ==== @@ -302,10 +302,11 @@ * for the kldload/unload case to work. If we failed to do that, then * we'd get duplicate devices when cbb.ko was reloaded. */ - device_get_children(brdev, &devlist, &numdevs); - for (tmp = 0; tmp < numdevs; tmp++) - device_delete_child(brdev, devlist[tmp]); - free(devlist, M_TEMP); + if (!device_get_children(brdev, &devlist, &numdevs)) { + for (tmp = 0; tmp < numdevs; tmp++) + device_delete_child(brdev, devlist[tmp]); + free(devlist, M_TEMP); + } /* Turn off the interrupts */ cbb_set(sc, CBB_SOCKET_MASK, 0); @@ -413,14 +414,15 @@ int wake = 0; DEVICE_IDENTIFY(driver, brdev); - device_get_children(brdev, &devlist, &numdevs); - for (tmp = 0; tmp < numdevs; tmp++) { + if (!device_get_children(brdev, &devlist, &numdevs)) { + for (tmp = 0; tmp < numdevs; tmp++) { dev = devlist[tmp]; if (device_get_state(dev) == DS_NOTPRESENT && device_probe_and_attach(dev) == 0) wake++; + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); if (wake > 0) { mtx_lock(&sc->mtx); ==== //depot/projects/usb/src/sys/dev/pci/pci.c#3 (text+ko) ==== @@ -1193,7 +1193,8 @@ acpi_dev = NULL; if (pci_do_power_resume) acpi_dev = devclass_get_device(devclass_find("acpi"), 0); - device_get_children(dev, &devlist, &numdevs); + if (device_get_children(dev, &devlist, &numdevs)) + return ENOMEM; for (i = 0; i < numdevs; i++) { child = devlist[i]; dinfo = (struct pci_devinfo *) device_get_ivars(child); @@ -1240,7 +1241,8 @@ acpi_dev = NULL; if (pci_do_power_resume) acpi_dev = devclass_get_device(devclass_find("acpi"), 0); - device_get_children(dev, &devlist, &numdevs); + if (device_get_children(dev, &devlist, &numdevs)) + return ENOMEM; for (i = 0; i < numdevs; i++) { /* * Notify ACPI we're going to D0 but ignore the result. If @@ -1289,8 +1291,8 @@ if (bootverbose) device_printf(dev, "driver added\n"); DEVICE_IDENTIFY(driver, dev); - device_get_children(dev, &devlist, &numdevs); - for (i = 0; i < numdevs; i++) { + if (!device_get_children(dev, &devlist, &numdevs)) { + for (i = 0; i < numdevs; i++) { child = devlist[i]; if (device_get_state(child) != DS_NOTPRESENT) continue; @@ -1302,8 +1304,9 @@ pci_cfg_restore(child, dinfo); if (device_probe_and_attach(child) != 0) pci_cfg_save(child, dinfo, 1); + } + free(devlist, M_TEMP); } - free(devlist, M_TEMP); } int ==== //depot/projects/usb/src/sys/dev/ppbus/ppbconf.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/ppc/ppc.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/dev/sound/pci/csa.c#2 (text+ko) ==== @@ -120,8 +120,8 @@ for (i = 0, busp = pci_devices; i < pci_count; i++, busp++) { pci_childcount = 0; - device_get_children(*busp, &pci_children, &pci_childcount); - for (j = 0, childp = pci_children; j < pci_childcount; j++, childp++) { + if (!device_get_children(*busp, &pci_children, &pci_childcount)) { + for (j = 0, childp = pci_children; j < pci_childcount; j++, childp++) { if (pci_get_vendor(*childp) == 0x8086 && pci_get_device(*childp) == 0x7113) { port = (pci_read_config(*childp, 0x41, 1) << 8) + 0x10; /* XXX */ @@ -135,8 +135,9 @@ free(pci_children, M_TEMP); return 0; } + } + free(pci_children, M_TEMP); } - free(pci_children, M_TEMP); } free(pci_devices, M_TEMP); ==== //depot/projects/usb/src/sys/dev/sound/pci/emu10kx.c#2 (text+ko) ==== @@ -2949,12 +2949,13 @@ r = device_delete_child(dev, sc->midi[1]); if (r) return (r); - (void)device_get_children(dev, &childlist, &devcount); - for (i = 0; i < devcount - 1; i++) { + if (!device_get_children(dev, &childlist, &devcount)) { + for (i = 0; i < devcount - 1; i++) { /* XXX why is there "-1" here ? */ device_printf(dev, "removing stale child %d (unit %d)\n", i, device_get_unit(childlist[i])); device_delete_child(dev, childlist[i]); + } + free(childlist, M_TEMP); } - free(childlist, M_TEMP); /* shutdown chip */ emu_uninit(sc); ==== //depot/projects/usb/src/sys/dev/spibus/spibus.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/i386/pci/pci_bus.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/isa/isa_common.c#3 (text+ko) ==== ==== //depot/projects/usb/src/sys/kern/kern_cpu.c#2 (text+ko) ==== ==== //depot/projects/usb/src/sys/kern/subr_bus.c#3 (text+ko) ==== @@ -1849,6 +1849,7 @@ device_get_children(device_t dev, device_t **devlistp, int *devcountp) { int count; + int n; device_t child; device_t *list; @@ -1857,14 +1858,31 @@ count++; } - list = malloc(count * sizeof(device_t), M_TEMP, M_NOWAIT|M_ZERO); - if (!list) + if (count == 0) { + /* avoid zero size allocation */ + n = 1 * sizeof(device_t); + } else { + n = count * sizeof(device_t); + } + + list = malloc(n, M_TEMP, M_NOWAIT|M_ZERO); + if (!list) { + *devlistp = NULL; + *devcountp = 0; return (ENOMEM); + } - count = 0; + n = 0; TAILQ_FOREACH(child, &dev->children, link) { - list[count] = child; - count++; + if (n < count) { + list[n] = child; + n++; + } + } + + if (n != count) { + printf("device_get_children: Number of devices changed " + "from %d to %d!\n", count, n); } *devlistp = list; ==== //depot/projects/usb/src/sys/pci/agp.c#3 (text+ko) ==== @@ -118,8 +118,8 @@ bus = devclass_get_device(pci, busnum); if (!bus) continue; - device_get_children(bus, &kids, &numkids); - for (i = 0; i < numkids; i++) { + if (!device_get_children(bus, &kids, &numkids)) { + for (i = 0; i < numkids; i++) { dev = kids[i]; if (pci_get_class(dev) == PCIC_DISPLAY && pci_get_subclass(dev) == PCIS_DISPLAY_VGA) @@ -128,8 +128,9 @@ return dev; } + } + free(kids, M_TEMP); } - free(kids, M_TEMP); } return 0; ==== //depot/projects/usb/src/sys/pci/agp_i810.c#3 (text+ko) ==== ==== //depot/projects/usb/src/sys/pci/if_sis.c#3 (text+ko) ==== @@ -349,20 +349,22 @@ for (i = 0, busp = pci_devices; i < pci_count; i++, busp++) { pci_childcount = 0; - device_get_children(*busp, &pci_children, &pci_childcount); - for (j = 0, childp = pci_children; + if (!device_get_children(*busp, &pci_children, &pci_childcount)) { + 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); } ==== //depot/projects/usb/src/sys/sys/bus.h#3 (text+ko) ====