All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Fix segfault in get_all_assigned_devices
@ 2011-07-13 11:37 Stefano Stabellini
  2011-07-14 14:49 ` Ian Jackson
  0 siblings, 1 reply; 2+ messages in thread
From: Stefano Stabellini @ 2011-07-13 11:37 UTC (permalink / raw)
  To: xen-devel; +Cc: Paul Durrant

Fix segfault in get_all_assigned_devices

pcidevs is an array of ndev elements (ndev is the number of pci devices
assigend to a specific domain), but we access pcidevs + *num
where *num is the global number of pci devices assigned so far to all
domains in the system.

Fix the issue removing pcidevs and just realloc'ing *list every time we
want to add a new pci device to the array.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r 00d2c5ca26fd tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Fri Jul 08 18:35:24 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Wed Jul 13 11:27:24 2011 +0000
@@ -422,7 +422,6 @@ retry_transaction2:
 
 static int get_all_assigned_devices(libxl__gc *gc, libxl_device_pci **list, int *num)
 {
-    libxl_device_pci *pcidevs = NULL;
     char **domlist;
     unsigned int nd = 0, i;
 
@@ -439,8 +438,7 @@ static int get_all_assigned_devices(libx
             int ndev = atoi(num_devs), j;
             char *devpath, *bdf;
 
-            pcidevs = libxl__calloc(gc, sizeof(*pcidevs), ndev);
-            for(j = (pcidevs) ? 0 : ndev; j < ndev; j++) {
+            for(j = 0; j < ndev; j++) {
                 devpath = libxl__sprintf(gc, "/local/domain/0/backend/pci/%s/0/dev-%u",
                                         domlist[i], j);
                 bdf = libxl__xs_read(gc, XBT_NULL, devpath);
@@ -449,19 +447,16 @@ static int get_all_assigned_devices(libx
                     if ( sscanf(bdf, PCI_BDF, &dom, &bus, &dev, &func) != 4 )
                         continue;
 
-                    pcidev_init(pcidevs + *num, dom, bus, dev, func, 0);
+                    *list = realloc(*list, sizeof(libxl_device_pci) * ((*num) + 1));
+                    if (*list == NULL)
+                        return ERROR_NOMEM;
+                    pcidev_init(*list + *num, dom, bus, dev, func, 0);
                     (*num)++;
                 }
             }
         }
     }
-
-    if ( 0 == *num ) {
-        free(pcidevs);
-        pcidevs = NULL;
-    }else{
-        *list = pcidevs;
-    }
+    libxl__ptr_add(gc, *list);
 
     return 0;
 }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Fix segfault in get_all_assigned_devices
  2011-07-13 11:37 [PATCH] Fix segfault in get_all_assigned_devices Stefano Stabellini
@ 2011-07-14 14:49 ` Ian Jackson
  0 siblings, 0 replies; 2+ messages in thread
From: Ian Jackson @ 2011-07-14 14:49 UTC (permalink / raw)
  To: Stefano Stabellini; +Cc: xen-devel, Paul Durrant

Stefano Stabellini writes ("[Xen-devel] [PATCH] Fix segfault in get_all_assigned_devices"):
> Fix segfault in get_all_assigned_devices

Applied, thanks.

Ian.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-07-14 14:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-13 11:37 [PATCH] Fix segfault in get_all_assigned_devices Stefano Stabellini
2011-07-14 14:49 ` Ian Jackson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.