* src/xml.c: applied patch from Jim Meyering fixing parseNumber

to detect overflow, and also reindented the module.
Daniel
This commit is contained in:
Daniel Veillard 2007-10-24 14:22:25 +00:00
parent de327d23e7
commit 211a20aefb
2 changed files with 453 additions and 386 deletions

View File

@ -1,3 +1,8 @@
Wed Oct 24 16:21:02 CEST 2007 Daniel Veillard <veillard@redhat.com>
* src/xml.c: applied patch from Jim Meyering fixing parseNumber
to detect overflow, and also reindented the module.
Wed Oct 24 10:38:38 CEST 2007 Daniel Veillard <veillard@redhat.com>
* po/id.po: Remove again bogus Project-Id-Version field from merge error

238
src/xml.c
View File

@ -1,7 +1,7 @@
/*
* xml.c: XML based interfaces for the libvir library
*
* Copyright (C) 2005 Red Hat, Inc.
* Copyright (C) 2005, 2007 Red Hat, Inc.
*
* See COPYING.LIB for the License of this software
*
@ -36,7 +36,8 @@
* Report an error coming from the XML module.
*/
static void
virXMLError(virConnectPtr conn, virErrorNumber error, const char *info, int value)
virXMLError(virConnectPtr conn, virErrorNumber error, const char *info,
int value)
{
const char *errmsg;
@ -63,11 +64,13 @@ virXMLError(virConnectPtr conn, virErrorNumber error, const char *info, int valu
* by xend
*/
static void
skipSpaces(const char **str) {
skipSpaces(const char **str)
{
const char *cur = *str;
while ((*cur == ' ') || (*cur == '\t') || (*cur == '\n') ||
(*cur == '\r') || (*cur == '\\')) cur++;
(*cur == '\r') || (*cur == '\\'))
cur++;
*str = cur;
}
@ -75,13 +78,14 @@ skipSpaces(const char **str) {
* parseNumber:
* @str: pointer to the char pointer used
*
* Parse a number
* Parse an unsigned number
*
* Returns the CPU number or -1 in case of error. @str will be
* Returns the unsigned number or -1 in case of error. @str will be
* updated to skip the number.
*/
static int
parseNumber(const char **str) {
parseNumber(const char **str)
{
int ret = 0;
const char *cur = *str;
@ -89,7 +93,12 @@ parseNumber(const char **str) {
return (-1);
while ((*cur >= '0') && (*cur <= '9')) {
ret = ret * 10 + (*cur - '0');
unsigned int c = *cur - '0';
if ((ret > INT_MAX / 10) ||
((ret == INT_MAX / 10) && (c > INT_MAX % 10)))
return (-1);
ret = ret * 10 + c;
cur++;
}
*str = cur;
@ -107,7 +116,8 @@ parseNumber(const char **str) {
* updated to skip the number.
*/
static int
parseCpuNumber(const char **str, int maxcpu) {
parseCpuNumber(const char **str, int maxcpu)
{
int ret = 0;
const char *cur = *str;
@ -202,15 +212,16 @@ saveCpuSet(virConnectPtr conn, char *cpuset, int maxcpu)
* @str is updated to the end of the part parsed
*/
int
virParseCpuSet(virConnectPtr conn, const char **str, char sep, char *cpuset,
int maxcpu)
virParseCpuSet(virConnectPtr conn, const char **str, char sep,
char *cpuset, int maxcpu)
{
const char *cur;
int ret = 0;
int i, start, last;
int neg = 0;
if ((str == NULL) || (cpuset == NULL) || (maxcpu <= 0) || (maxcpu >100000))
if ((str == NULL) || (cpuset == NULL) || (maxcpu <= 0) ||
(maxcpu > 100000))
return (-1);
cur = *str;
@ -299,8 +310,8 @@ parse_error:
* Returns 0 in case of success, -1 in case of error
*/
int
virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml, const char *str,
int maxcpu)
virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml,
const char *str, int maxcpu)
{
const char *cur;
char *cpuset = NULL;
@ -353,7 +364,8 @@ virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml, const char *str,
dump = saveCpuSet(conn, cpuset, maxcpu);
if (dump != NULL) {
virBufferVSprintf (xml, " <dump>%s</dump>\n", dump);
virBufferVSprintf(xml, " <dump>%s</dump>\n",
dump);
free(dump);
} else {
virBufferVSprintf(xml, " <error>%s</error>\n",
@ -382,8 +394,7 @@ virParseXenCpuTopology(virConnectPtr conn, virBufferPtr xml, const char *str,
return (0);
parse_error:
virXMLError(conn, VIR_ERR_XEN_CALL,
_("topology syntax error"), 0);
virXMLError(conn, VIR_ERR_XEN_CALL, _("topology syntax error"), 0);
error:
if (cpuset != NULL)
free(cpuset);
@ -416,7 +427,8 @@ memory_error:
* if the evaluation failed.
*/
char *
virXPathString(const char *xpath, xmlXPathContextPtr ctxt) {
virXPathString(const char *xpath, xmlXPathContextPtr ctxt)
{
xmlXPathObjectPtr obj;
char *ret;
@ -452,7 +464,8 @@ virXPathString(const char *xpath, xmlXPathContextPtr ctxt) {
* or -1 if the evaluation failed.
*/
int
virXPathNumber(const char *xpath, xmlXPathContextPtr ctxt, double *value) {
virXPathNumber(const char *xpath, xmlXPathContextPtr ctxt, double *value)
{
xmlXPathObjectPtr obj;
if ((ctxt == NULL) || (xpath == NULL) || (value == NULL)) {
@ -485,7 +498,8 @@ virXPathNumber(const char *xpath, xmlXPathContextPtr ctxt, double *value) {
* value doesn't have a long format.
*/
int
virXPathLong(const char *xpath, xmlXPathContextPtr ctxt, long *value) {
virXPathLong(const char *xpath, xmlXPathContextPtr ctxt, long *value)
{
xmlXPathObjectPtr obj;
int ret = 0;
@ -530,7 +544,8 @@ virXPathLong(const char *xpath, xmlXPathContextPtr ctxt, long *value) {
* Returns 0 if false, 1 if true, or -1 if the evaluation failed.
*/
int
virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt) {
virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt)
{
xmlXPathObjectPtr obj;
int ret;
@ -562,7 +577,8 @@ virXPathBoolean(const char *xpath, xmlXPathContextPtr ctxt) {
* Returns a pointer to the node or NULL if the evaluation failed.
*/
xmlNodePtr
virXPathNode(const char *xpath, xmlXPathContextPtr ctxt) {
virXPathNode(const char *xpath, xmlXPathContextPtr ctxt)
{
xmlXPathObjectPtr obj;
xmlNodePtr ret;
@ -583,6 +599,7 @@ virXPathNode(const char *xpath, xmlXPathContextPtr ctxt) {
xmlXPathFreeObject(obj);
return (ret);
}
/**
* virXPathNodeSet:
* @xpath: the XPath string to evaluate
@ -595,7 +612,9 @@ virXPathNode(const char *xpath, xmlXPathContextPtr ctxt) {
* must be freed) or -1 if the evaluation failed.
*/
int
virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) {
virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt,
xmlNodePtr ** list)
{
xmlXPathObjectPtr obj;
int ret;
@ -619,9 +638,11 @@ virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) {
*list = malloc(ret * sizeof(xmlNodePtr));
if (*list == NULL) {
virXMLError(NULL, VIR_ERR_NO_MEMORY,
_("allocate string array"), ret * sizeof(xmlNodePtr));
_("allocate string array"),
ret * sizeof(xmlNodePtr));
} else {
memcpy(*list, obj->nodesetval->nodeTab, ret * sizeof(xmlNodePtr));
memcpy(*list, obj->nodesetval->nodeTab,
ret * sizeof(xmlNodePtr));
}
}
xmlXPathFreeObject(obj);
@ -648,7 +669,10 @@ virXPathNodeSet(const char *xpath, xmlXPathContextPtr ctxt, xmlNodePtr **list) {
*
* Returns 0 in case of success, -1 in case of error
*/
static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf, int xendConfigVersion)
static int
virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSED,
xmlNodePtr node, virBufferPtr buf,
int xendConfigVersion)
{
xmlChar *graphics_type = NULL;
@ -662,20 +686,22 @@ static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSE
*virBufferAdd(buf, "(display localhost:10.0)", 24);
*virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30);
*/
}
else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
} else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
virBufferAdd(buf, "(vnc 1)", 7);
if (xendConfigVersion >= 2) {
xmlChar *vncport = xmlGetProp(node, BAD_CAST "port");
xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen");
xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd");
xmlChar *keymap = xmlGetProp(node, BAD_CAST "keymap");
if (vncport != NULL) {
long port = strtol((const char *) vncport, NULL, 10);
if (port == -1)
virBufferAdd(buf, "(vncunused 1)", 13);
else if (port >= 5900)
virBufferVSprintf(buf, "(vncdisplay %ld)", port - 5900);
virBufferVSprintf(buf, "(vncdisplay %ld)",
port - 5900);
xmlFree(vncport);
}
if (vnclisten != NULL) {
@ -711,7 +737,9 @@ static int virDomainParseXMLGraphicsDescImage(virConnectPtr conn ATTRIBUTE_UNUSE
*
* Returns 0 in case of success, -1 in case of error
*/
static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf)
static int
virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED,
xmlNodePtr node, virBufferPtr buf)
{
xmlChar *graphics_type = NULL;
@ -727,19 +755,21 @@ static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED,
*virBufferAdd(buf, "(display localhost:10.0)", 24);
*virBufferAdd(buf, "(xauthority /root/.Xauthority)", 30);
*/
}
else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
} else if (xmlStrEqual(graphics_type, BAD_CAST "vnc")) {
virBufferAdd(buf, "(type vnc)", 10);
xmlChar *vncport = xmlGetProp(node, BAD_CAST "port");
xmlChar *vnclisten = xmlGetProp(node, BAD_CAST "listen");
xmlChar *vncpasswd = xmlGetProp(node, BAD_CAST "passwd");
xmlChar *keymap = xmlGetProp(node, BAD_CAST "keymap");
if (vncport != NULL) {
long port = strtol((const char *) vncport, NULL, 10);
if (port == -1)
virBufferAdd(buf, "(vncunused 1)", 13);
else if (port >= 5900)
virBufferVSprintf(buf, "(vncdisplay %ld)", port - 5900);
virBufferVSprintf(buf, "(vncdisplay %ld)",
port - 5900);
xmlFree(vncport);
}
if (vnclisten != NULL) {
@ -779,7 +809,9 @@ static int virDomainParseXMLGraphicsDescVFB(virConnectPtr conn ATTRIBUTE_UNUSED,
* Returns 0 in case of success, -1 in case of error.
*/
static int
virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int vcpus, int xendConfigVersion)
virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node,
virBufferPtr buf, xmlXPathContextPtr ctxt,
int vcpus, int xendConfigVersion)
{
xmlNodePtr cur, txt;
xmlNodePtr *nodes = NULL;
@ -793,8 +825,8 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
cur = node->children;
while (cur != NULL) {
if (cur->type == XML_ELEMENT_NODE) {
if ((type == NULL)
&& (xmlStrEqual(cur->name, BAD_CAST "type"))) {
if ((type == NULL) &&
(xmlStrEqual(cur->name, BAD_CAST "type"))) {
txt = cur->children;
if ((txt != NULL) && (txt->type == XML_TEXT_NODE) &&
(txt->next == NULL))
@ -807,8 +839,11 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
loader = txt->content;
} else if ((xmlStrEqual(cur->name, BAD_CAST "boot"))) {
xmlChar *boot_dev = xmlGetProp(cur, BAD_CAST "dev");
if (nbootorder == ((sizeof(bootorder)/sizeof(bootorder[0]))-1)) {
virXMLError(conn, VIR_ERR_XML_ERROR, "too many boot devices", 0);
if (nbootorder ==
((sizeof(bootorder) / sizeof(bootorder[0])) - 1)) {
virXMLError(conn, VIR_ERR_XML_ERROR,
"too many boot devices", 0);
return (-1);
}
if (xmlStrEqual(boot_dev, BAD_CAST "fd")) {
@ -859,10 +894,12 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
virBufferVSprintf(buf, "(boot %s)", bootorder);
/* get the 1st floppy device file */
cur = virXPathNode("/domain/devices/disk[@device='floppy' and target/@dev='fda']/source",
cur = virXPathNode(
"/domain/devices/disk[@device='floppy' and target/@dev='fda']/source",
ctxt);
if (cur != NULL) {
xmlChar *fdfile;
fdfile = xmlGetProp(cur, BAD_CAST "file");
if (fdfile != NULL) {
virBufferVSprintf(buf, "(fda '%s')", fdfile);
@ -871,10 +908,12 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
}
/* get the 2nd floppy device file */
cur = virXPathNode("/domain/devices/disk[@device='floppy' and target/@dev='fdb']/source",
cur = virXPathNode(
"/domain/devices/disk[@device='floppy' and target/@dev='fdb']/source",
ctxt);
if (cur != NULL) {
xmlChar *fdfile;
fdfile = xmlGetProp(cur, BAD_CAST "file");
if (fdfile != NULL) {
virBufferVSprintf(buf, "(fdb '%s')", fdfile);
@ -886,7 +925,8 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
/* get the cdrom device file */
/* Only XenD <= 3.0.2 wants cdrom config here */
if (xendConfigVersion == 1) {
cur = virXPathNode("/domain/devices/disk[@device='cdrom' and target/@dev='hdc']/source",
cur = virXPathNode(
"/domain/devices/disk[@device='cdrom' and target/@dev='hdc']/source",
ctxt);
if (cur != NULL) {
xmlChar *cdfile;
@ -911,6 +951,7 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
nb_nodes = virXPathNodeSet("/domain/devices/input", ctxt, &nodes);
if (nb_nodes > 0) {
int i;
for (i = 0; i < nb_nodes; i++) {
xmlChar *itype = NULL, *bus = NULL;
int isMouse = 1;
@ -1013,7 +1054,9 @@ virDomainParseXMLOSDescHVM(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf
* Returns 0 in case of success, -1 in case of error.
*/
static int
virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, xmlXPathContextPtr ctxt, int xendConfigVersion)
virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node,
virBufferPtr buf, xmlXPathContextPtr ctxt,
int xendConfigVersion)
{
xmlNodePtr cur, txt;
const xmlChar *type = NULL;
@ -1106,7 +1149,8 @@ virDomainParseXMLOSDescPV(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
* error reporting.
*/
static void
virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...)
{
xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
if ((ctxt != NULL) &&
@ -1132,7 +1176,8 @@ virCatchXMLParseError(void *ctx, const char *msg ATTRIBUTE_UNUSED, ...) {
* Returns 0 in case of success, -1 in case of error.
*/
static int
virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf, int hvm, int xendConfigVersion)
virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
virBufferPtr buf, int hvm, int xendConfigVersion)
{
xmlNodePtr cur;
xmlChar *type = NULL;
@ -1189,9 +1234,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
/* There is a case without the source
* to the CD-ROM device
*/
if (hvm &&
device &&
!strcmp((const char *)device, "cdrom")) {
if (hvm && device && !strcmp((const char *) device, "cdrom")) {
isNoSrcCdrom = 1;
}
if (!isNoSrcCdrom) {
@ -1209,16 +1252,12 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
/* Xend (all versions) put the floppy device config
* under the hvm (image (os)) block
*/
if (hvm &&
device &&
!strcmp((const char *)device, "floppy")) {
if (hvm && device && !strcmp((const char *) device, "floppy")) {
goto cleanup;
}
/* Xend <= 3.0.2 doesn't include cdrom config here */
if (hvm &&
device &&
!strcmp((const char *)device, "cdrom")) {
if (hvm && device && !strcmp((const char *) device, "cdrom")) {
if (xendConfigVersion == 1)
goto cleanup;
else
@ -1228,8 +1267,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
virBufferAdd(buf, "(device ", 8);
/* Normally disks are in a (device (vbd ...)) block
but blktap disks ended up in a differently named
(device (tap ....)) block.... */
* but blktap disks ended up in a differently named
* (device (tap ....)) block.... */
if (drvName && !strcmp((const char *) drvName, "tap")) {
virBufferAdd(buf, "(tap ", 5);
} else {
@ -1238,6 +1277,7 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
if (hvm) {
char *tmp = (char *) target;
/* Just in case user mistakenly still puts ioemu: in their XML */
if (!strncmp((const char *) tmp, "ioemu:", 6))
tmp += 6;
@ -1246,7 +1286,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
if (xendConfigVersion == 1)
virBufferVSprintf(buf, "(dev 'ioemu:%s')", (const char *) tmp);
else /* But newer does not */
virBufferVSprintf(buf, "(dev '%s%s')", (const char *)tmp, cdrom ? ":cdrom" : ":disk");
virBufferVSprintf(buf, "(dev '%s%s')", (const char *) tmp,
cdrom ? ":cdrom" : ":disk");
} else
virBufferVSprintf(buf, "(dev '%s')", (const char *) target);
@ -1310,7 +1351,9 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node, virBufferPtr buf,
* Returns 0 in case of success, -1 in case of error.
*/
static int
virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, virBufferPtr buf, int hvm, int xendConfigVersion)
virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED,
xmlNodePtr node, virBufferPtr buf, int hvm,
int xendConfigVersion)
{
xmlNodePtr cur;
xmlChar *type = NULL;
@ -1351,9 +1394,9 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
} else if ((ip == NULL) &&
(xmlStrEqual(cur->name, BAD_CAST "ip"))) {
/* XXX in future expect to need to have > 1 ip
address element - eg ipv4 & ipv6. For now
xen only supports a single address though
so lets ignore that complication */
* address element - eg ipv4 & ipv6. For now
* xen only supports a single address though
* so lets ignore that complication */
ip = xmlGetProp(cur, BAD_CAST "address");
}
}
@ -1365,12 +1408,18 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
unsigned int addr[12];
int tmp = sscanf((const char *) mac,
"%01x%01x:%01x%01x:%01x%01x:%01x%01x:%01x%01x:%01x%01x",
(unsigned int*)&addr[0], (unsigned int*)&addr[1],
(unsigned int*)&addr[2], (unsigned int*)&addr[3],
(unsigned int*)&addr[4], (unsigned int*)&addr[5],
(unsigned int*)&addr[6], (unsigned int*)&addr[7],
(unsigned int*)&addr[8], (unsigned int*)&addr[9],
(unsigned int*)&addr[10], (unsigned int*)&addr[11]);
(unsigned int *) &addr[0],
(unsigned int *) &addr[1],
(unsigned int *) &addr[2],
(unsigned int *) &addr[3],
(unsigned int *) &addr[4],
(unsigned int *) &addr[5],
(unsigned int *) &addr[6],
(unsigned int *) &addr[7],
(unsigned int *) &addr[8],
(unsigned int *) &addr[9],
(unsigned int *) &addr[10],
(unsigned int *) &addr[11]);
if (tmp != 12 || strlen((const char *) mac) != 17) {
virXMLError(conn, VIR_ERR_INVALID_MAC, (const char *) mac, 0);
goto error;
@ -1383,12 +1432,15 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
else if (typ == 1) /* TODO does that work like that ? */
virBufferVSprintf(buf, "(dev '%s')", (const char *) source);
else {
virNetworkPtr network = virNetworkLookupByName(conn, (const char *) source);
virNetworkPtr network =
virNetworkLookupByName(conn, (const char *) source);
char *bridge;
if (!network || !(bridge = virNetworkGetBridgeName(network))) {
if (network)
virNetworkFree(network);
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) source, 0);
virXMLError(conn, VIR_ERR_NO_SOURCE, (const char *) source,
0);
goto error;
}
virNetworkFree(network);
@ -1436,7 +1488,8 @@ virDomainParseXMLIfDesc(virConnectPtr conn ATTRIBUTE_UNUSED, xmlNodePtr node, vi
* the caller must free() the returned value.
*/
char *
virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int xendConfigVersion)
virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name,
int xendConfigVersion)
{
xmlDocPtr xml = NULL;
xmlNodePtr node;
@ -1473,8 +1526,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
*/
pctxt->sax->error = virCatchXMLParseError;
xml = xmlCtxtReadDoc(pctxt, (const xmlChar *) xmldesc, "domain.xml", NULL,
XML_PARSE_NOENT | XML_PARSE_NONET |
xml = xmlCtxtReadDoc(pctxt, (const xmlChar *) xmldesc, "domain.xml",
NULL, XML_PARSE_NOENT | XML_PARSE_NONET |
XML_PARSE_NOWARNING);
if (xml == NULL) {
goto error;
@ -1513,8 +1566,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
max_mem = (f / 1024);
}
if ((virXPathNumber("number(/domain/currentMemory[1])", ctxt, &f) < 0) ||
(f < MIN_XEN_GUEST_SIZE * 1024)) {
if ((virXPathNumber("number(/domain/currentMemory[1])", ctxt, &f) < 0)
|| (f < MIN_XEN_GUEST_SIZE * 1024)) {
mem = max_mem;
} else {
mem = (f / 1024);
@ -1575,8 +1628,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
*/
bootloader = 1;
free(str);
} else if (virXPathNumber("count(/domain/bootloader)", ctxt, &f) == 0 &&
(f > 0)) {
} else if (virXPathNumber("count(/domain/bootloader)", ctxt, &f) == 0
&& (f > 0)) {
virBufferVSprintf(&buf, "(bootloader)");
/*
* if using a bootloader, the kernel and initrd strings are not
@ -1619,14 +1672,16 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
if ((str == NULL) || (strcmp(str, "hvm"))) {
res = virDomainParseXMLOSDescPV(conn, node,
&buf, ctxt, xendConfigVersion);
&buf, ctxt,
xendConfigVersion);
} else {
hvm = 1;
res = virDomainParseXMLOSDescHVM(conn, node, &buf, ctxt,
vcpus, xendConfigVersion);
}
if (str != NULL) free(str);
if (str != NULL)
free(str);
if (res != 0)
goto error;
@ -1654,7 +1709,9 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
if (nb_nodes > 0) {
for (i = 0; i < nb_nodes; i++) {
virBufferAdd(&buf, "(device ", 8);
res = virDomainParseXMLIfDesc(conn, nodes[i], &buf, hvm, xendConfigVersion);
res =
virDomainParseXMLIfDesc(conn, nodes[i], &buf, hvm,
xendConfigVersion);
if (res != 0) {
free(nodes);
goto error;
@ -1728,7 +1785,8 @@ virDomainParseXMLDesc(virConnectPtr conn, const char *xmldesc, char **name, int
* the caller must free() the returned value.
*/
char *
virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm, int xendConfigVersion)
virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm,
int xendConfigVersion)
{
xmlDocPtr xml = NULL;
xmlNodePtr node;
@ -1751,14 +1809,15 @@ virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm, int xendConf
if (node == NULL)
goto error;
if (xmlStrEqual(node->name, BAD_CAST "disk")) {
if (virDomainParseXMLDiskDesc(conn, node, &buf, hvm, xendConfigVersion) != 0)
if (virDomainParseXMLDiskDesc(conn, node, &buf, hvm,
xendConfigVersion) != 0)
goto error;
/* SXP is not created when device is "floppy". */
else if (buf.use == 0)
goto error;
}
else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
if (virDomainParseXMLIfDesc(conn, node, &buf, hvm, xendConfigVersion) != 0)
} else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
if (virDomainParseXMLIfDesc(conn, node, &buf, hvm,
xendConfigVersion) != 0)
goto error;
} else {
virXMLError(conn, VIR_ERR_XML_ERROR, (const char *) node->name, 0);
@ -1789,11 +1848,13 @@ virParseXMLDevice(virConnectPtr conn, const char *xmldesc, int hvm, int xendConf
* Returns 0 in case of success, -1 in case of failure.
*/
int
virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class, char *ref, int ref_len)
virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class,
char *ref, int ref_len)
{
xmlDocPtr xml = NULL;
xmlNodePtr node, cur;
xmlChar *attr = NULL;
#ifdef WITH_XEN
char *xref;
#endif /* WITH_XEN */
@ -1813,7 +1874,8 @@ virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class, char *r
strcpy(class, "vbd");
for (cur = node->children; cur != NULL; cur = cur->next) {
if ((cur->type != XML_ELEMENT_NODE) ||
(!xmlStrEqual(cur->name, BAD_CAST "target"))) continue;
(!xmlStrEqual(cur->name, BAD_CAST "target")))
continue;
attr = xmlGetProp(cur, BAD_CAST "dev");
if (attr == NULL)
goto error;
@ -1821,12 +1883,12 @@ virDomainXMLDevID(virDomainPtr domain, const char *xmldesc, char *class, char *r
ref[ref_len - 1] = '\0';
goto cleanup;
}
}
else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
} else if (xmlStrEqual(node->name, BAD_CAST "interface")) {
strcpy(class, "vif");
for (cur = node->children; cur != NULL; cur = cur->next) {
if ((cur->type != XML_ELEMENT_NODE) ||
(!xmlStrEqual(cur->name, BAD_CAST "mac"))) continue;
(!xmlStrEqual(cur->name, BAD_CAST "mac")))
continue;
attr = xmlGetProp(cur, BAD_CAST "address");
if (attr == NULL)
goto error;