hvm: Fix PCI-passthru string parsing.

Fixes crash of xend during HVM domain ccreation.
Signed-off-by: Keir Fraser <keir@xensource.com>
This commit is contained in:
Keir Fraser committed 2007-10-20 09:30:00 +01:00
1 parent 07f557cb63
commit 88561d3058
2 files changed
+21 -69

No files matched your search

+11 -35
View 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));
token = strchr(token, 'x') + 1;
return strtol(token, NULL, 16);
}
static int first_bdf(char *pci_str, 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(pci_str, ",", 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);
*func = token_value(token);
return 1;
}
static int next_bdf(char **last, int *seg, int *bus, int *dev, int *func)
{
char *token;
token = strtok_r(NULL, ",", 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);
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;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.