hvm: Fix PCI-passthru string parsing.
authorKeir Fraser <keir@xensource.com>
Sat, 20 Oct 2007 08:30:00 +0000 (09:30 +0100)
committerKeir Fraser <keir@xensource.com>
Sat, 20 Oct 2007 08:30:00 +0000 (09:30 +0100)
Fixes crash of xend during HVM domain ccreation.
Signed-off-by: Keir Fraser <keir@xensource.com>
tools/ioemu/hw/pass-through.c
tools/python/xen/lowlevel/xc/xc.c

index e4696fb7854bf63013bf0252a3758293fa5488cb..b44529187437fb31474e905ebf633b63e1e58983 100644 (file)
@@ -31,48 +31,28 @@ extern FILE *logfile;
 
 static int token_value(char *token)
 {
-    token = strchr(token, 'x');
-    token = token + 1;
-
-    return ((int) strtol(token, NULL, 16));
-}
-
-static int first_bdf(char *pci_str, char **last,
-                     int *seg, int *bus, int *dev, int *func)
-{
-    char *token;
-
-    token = strtok_r(pci_str, ",", last);
-    if ( !token )
-        return 0;
-
-    *seg  = token_value(token);
-    token = strtok_r(NULL, ",", last);
-    *bus  = token_value(token);
-    token = strtok_r(NULL, ",", last);
-    *dev  = token_value(token);
-    token = strtok_r(NULL, ",", last);
-    *func  = token_value(token);
-
-    return 1;
+    token = strchr(token, 'x') + 1;
+    return strtol(token, NULL, 16);
 }
 
-static int next_bdf(char **last, int *seg, int *bus, int *dev, int *func)
+static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func)
 {
     char *token;
 
-    token = strtok_r(NULL, ",", last);
+    token = strchr(*str, ',');
     if ( !token )
         return 0;
+    token++;
 
     *seg  = token_value(token);
-    token = strtok_r(NULL, ",", last);
+    token = strchr(token, ',') + 1;
     *bus  = token_value(token);
-    token = strtok_r(NULL, ",", last);
+    token = strchr(token, ',') + 1;
     *dev  = token_value(token);
-    token = strtok_r(NULL, ",", last);
+    token = strchr(token, ',') + 1;
     *func  = token_value(token);
 
+    *str = token;
     return 1;
 }
 
@@ -422,8 +402,6 @@ int pt_init(PCIBus *e_bus, char *direct_pci)
     int seg, b, d, f;
     struct pt_dev *pt_dev;
     struct pci_access *pci_access;
-    int get_bdf;
-    char *last = NULL;
 
     /* Initialize libpci */
     pci_access = pci_alloc();
@@ -436,9 +414,7 @@ int pt_init(PCIBus *e_bus, char *direct_pci)
     pci_scan_bus(pci_access);
 
     /* Assign given devices to guest */
-    for ( get_bdf = first_bdf(direct_pci, &last, &seg, &b, &d, &f);
-          get_bdf;
-          get_bdf = next_bdf(&last, &seg, &b, &d, &f) )
+    while ( next_bdf(&direct_pci, &seg, &b, &d, &f) )
     {
         /* Register real device with the emulated bus */
         pt_dev = register_real_device(e_bus, "DIRECT PCI", PT_VIRT_DEVFN_AUTO,
index 5716dbf2ec8f36b5da1cf8060e7e2993947d3134..2cf5c5bb73364e815f9430e344905712ffffa1dc 100644 (file)
@@ -531,48 +531,28 @@ static PyObject *pyxc_set_hvm_param(XcObject *self,
 
 static int token_value(char *token)
 {
-    token = strchr(token, 'x');
-    token = token + 1;
-
-    return ((int) strtol(token, NULL, 16));
-}
-
-static int first_bdf(char *pci_str, char **last,
-                     int *seg, int *bus, int *dev, int *func)
-{
-    char *token;
-
-    token = strtok_r(pci_str, ",", last);
-    if ( !token )
-        return 0;
-
-    *seg  = token_value(token);
-    token = strtok_r(NULL, ",", last);
-    *bus  = token_value(token);
-    token = strtok_r(NULL, ",", last);
-    *dev  = token_value(token);
-    token = strtok_r(NULL, ",", last);
-    *func  = token_value(token);
-
-    return 1;
+    token = strchr(token, 'x') + 1;
+    return strtol(token, NULL, 16);
 }
 
-static int next_bdf(char **last, int *seg, int *bus, int *dev, int *func)
+static int next_bdf(char **str, int *seg, int *bus, int *dev, int *func)
 {
     char *token;
 
-    token = strtok_r(NULL, ",", last);
+    token = strchr(*str, ',');
     if ( !token )
         return 0;
+    token++;
 
     *seg  = token_value(token);
-    token = strtok_r(NULL, ",", last);
+    token = strchr(token, ',') + 1;
     *bus  = token_value(token);
-    token = strtok_r(NULL, ",", last);
+    token = strchr(token, ',') + 1;
     *dev  = token_value(token);
-    token = strtok_r(NULL, ",", last);
+    token = strchr(token, ',') + 1;
     *func  = token_value(token);
 
+    *str = token;
     return 1;
 }
 
@@ -584,17 +564,13 @@ static PyObject *pyxc_assign_device(XcObject *self,
     char *pci_str;
     uint32_t bdf = 0;
     int seg, bus, dev, func;
-    int get_bdf;
-    char *last = NULL;
 
     static char *kwd_list[] = { "domid", "pci", NULL };
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|s", kwd_list,
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "is", kwd_list,
                                       &dom, &pci_str) )
         return NULL;
 
-    for ( get_bdf = first_bdf(pci_str, &last, &seg, &bus, &dev, &func);
-          get_bdf;
-          get_bdf = next_bdf(&last, &seg, &bus, &dev, &func) )
+    while ( next_bdf(&pci_str, &seg, &bus, &dev, &func) )
     {
         bdf |= (bus & 0xff) << 16;
         bdf |= (dev & 0x1f) << 11;