[libvirt] [libvirt-php][PATCH] libvirt_list_active_domains: Don't free domain before strduping its name

Michal Privoznik mprivozn at redhat.com
Wed Sep 7 16:01:30 UTC 2016


There's a bug in the implementation of
libvirt_list_active_domains(). We try to return an array of names
of active domains. So we iterate over array of domains as
returned by libvirt and get each domain's name. But we don't
obtain a duplicate of that name rather just a pointer into
virDomain object. The very next thing we do is we free the
virDomain object and then try to copy what's now invalid pointer.
Reverse the order of those two actions.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/libvirt-php.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index 2045c59..8edcb10 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -9128,18 +9128,15 @@ PHP_FUNCTION(libvirt_list_active_domains)
         domain=virDomainLookupByID(conn->conn,ids[i]);
         if (domain!=NULL)
         {
-            name=virDomainGetName(domain);
-
-            if (virDomainFree (domain))
-                resource_change_counter(INT_RESOURCE_DOMAIN, conn->conn, domain, 0 TSRMLS_CC);
-
-            if (name==NULL)
-            {
-                efree (ids);
+            if (!(name = virDomainGetName(domain))) {
+                efree(ids);
                 RETURN_FALSE;
             }
 
             VIRT_ADD_NEXT_INDEX_STRING(return_value, name);
+
+            if (virDomainFree(domain))
+                resource_change_counter(INT_RESOURCE_DOMAIN, conn->conn, domain, 0 TSRMLS_CC);
         }
     }
     efree(ids);
-- 
2.8.4




More information about the libvir-list mailing list