[libvirt] [PATCH] don't leak a file descriptor on failed pciGetDevice call

Jim Meyering jim at meyering.net
Tue Mar 3 10:13:40 UTC 2009


This loop would mistakenly return early (skipping the closedir)
upon pciGetDevice failure.

>From 2d4d1d25edf8f1c3f4770707215bba67d73fd59f Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Tue, 3 Mar 2009 11:11:07 +0100
Subject: [PATCH] don't leak a file descriptor on failed pciGetDevice call

* src/pci.c (pciIterDevices): Always close dir handle.
---
 src/pci.c |   14 +++++++++-----
 1 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/pci.c b/src/pci.c
index 2343be3..501c6aa 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
@@ -823,7 +827,7 @@ void
 pciFreeDevice(virConnectPtr conn ATTRIBUTE_UNUSED, pciDevice *dev)
 {
     VIR_DEBUG("%s %s: freeing", dev->id, dev->name);
-    if (dev->fd)
+    if (dev->fd >= 0)
         close(dev->fd);
     VIR_FREE(dev);
 }
--
1.6.2.rc1.285.gc5f54




More information about the libvir-list mailing list