diff --git a/ChangeLog b/ChangeLog index 903c92292b..bae760e693 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Mar 3 12:22:51 +0100 2009 Jim Meyering + + don't leak a file descriptor on failed pciGetDevice call + * src/pci.c (pciIterDevices): Always close dir handle. + Tue Mar 3 12:22:51 +0100 2009 Jim Meyering update .gitignore and .hgignore files diff --git a/src/pci.c b/src/pci.c index 2343be3e74..29a6dcc200 100644 --- a/src/pci.c +++ b/src/pci.c @@ -233,6 +233,7 @@ pciIterDevices(virConnectPtr conn, { DIR *dir; struct dirent *entry; + int ret = 0; *matched = NULL; @@ -252,14 +253,17 @@ pciIterDevices(virConnectPtr conn, if (entry->d_name[0] == '.') continue; - if (sscanf(entry->d_name, "%x:%x:%x.%x", &domain, &bus, &slot, &function) < 4) { + if (sscanf(entry->d_name, "%x:%x:%x.%x", + &domain, &bus, &slot, &function) < 4) { VIR_WARN("Unusual entry in " PCI_SYSFS "devices: %s", entry->d_name); continue; } try = pciGetDevice(conn, domain, bus, slot, function); - if (!try) - return -1; + if (!try) { + ret = -1; + break; + } if (predicate(try, dev)) { VIR_DEBUG("%s %s: iter matched on %s", dev->id, dev->name, try->name); @@ -269,7 +273,7 @@ pciIterDevices(virConnectPtr conn, pciFreeDevice(conn, try); } closedir(dir); - return 0; + return ret; } static uint8_t