Mercurial > illumos > illumos-gate
changeset 10293:ac02598ffdd8
6869654 pci_autoconfig: memory leak in memlist_alloc() in snv_121 on x86 on systems with zfs root
author | Dan Mick <Dan.Mick@Sun.COM> |
---|---|
date | Tue, 11 Aug 2009 19:17:28 -0700 |
parents | 5f64d818187b |
children | b85a363540de |
files | usr/src/uts/intel/io/pci/pci_boot.c |
diffstat | 1 files changed, 9 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/intel/io/pci/pci_boot.c Tue Aug 11 17:46:05 2009 -0700 +++ b/usr/src/uts/intel/io/pci/pci_boot.c Tue Aug 11 19:17:28 2009 -0700 @@ -600,7 +600,7 @@ int rv, cap_ptr, physhi; dev_info_t *dip; uint16_t cmd_reg; - struct memlist *list; + struct memlist *list, *scratch_list; /* skip root (peer) PCI busses */ if (pci_bus_res[secbus].par_bus == (uchar_t)-1) @@ -785,13 +785,13 @@ io_limit = ((io_limit & 0xf0) << 8) | 0xfff; /* Form list of all resources passed (avail + used) */ - list = memlist_dup(pci_bus_res[secbus].io_avail); - memlist_merge(&pci_bus_res[secbus].io_used, &list); + scratch_list = memlist_dup(pci_bus_res[secbus].io_avail); + memlist_merge(&pci_bus_res[secbus].io_used, &scratch_list); if ((pci_bus_res[parbus].io_reprogram || (io_base > io_limit) || (!(cmd_reg & PCI_COMM_IO))) && - !list_is_vga_only(list, IO)) { + !list_is_vga_only(scratch_list, IO)) { if (pci_bus_res[secbus].io_used) { memlist_subsume(&pci_bus_res[secbus].io_used, &pci_bus_res[secbus].io_avail); @@ -857,6 +857,7 @@ bus, dev, func, io_base, io_limit); } } + memlist_free_all(&scratch_list); /* * Check memory space as we did I/O space. @@ -866,13 +867,13 @@ mem_limit = (uint_t)pci_getw(bus, dev, func, PCI_BCNF_MEM_LIMIT); mem_limit = ((mem_limit & 0xfff0) << 16) | 0xfffff; - list = memlist_dup(pci_bus_res[secbus].mem_avail); - memlist_merge(&pci_bus_res[secbus].mem_used, &list); + scratch_list = memlist_dup(pci_bus_res[secbus].mem_avail); + memlist_merge(&pci_bus_res[secbus].mem_used, &scratch_list); if ((pci_bus_res[parbus].mem_reprogram || (mem_base > mem_limit) || (!(cmd_reg & PCI_COMM_MAE))) && - !list_is_vga_only(list, MEM)) { + !list_is_vga_only(scratch_list, MEM)) { if (pci_bus_res[secbus].mem_used) { memlist_subsume(&pci_bus_res[secbus].mem_used, &pci_bus_res[secbus].mem_avail); @@ -959,6 +960,7 @@ bus, dev, func, mem_base, mem_limit); } } + memlist_free_all(&scratch_list); cmd_enable: if (pci_bus_res[secbus].io_avail)