mirror of https://gitee.com/openkylin/libvirt.git
Fix crash using bogus arch in QEMU
This commit is contained in:
parent
896761e5c7
commit
3cb55cb51f
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
Fri Jan 30 16:12:22 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
|
||||||
|
Fix crash when using bogus arch type
|
||||||
|
* src/capabilities.c, src/capabilities.h: Add method to query
|
||||||
|
for supported arch+ostype combo
|
||||||
|
* src/domain_conf.c: Validate requested arch+ostype against
|
||||||
|
supported capabilities
|
||||||
|
* src/qemu_conf.c: Sanity check to avoid deferencing NULL
|
||||||
|
machine type
|
||||||
|
|
||||||
Fri Jan 30 16:58:22 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
|
Fri Jan 30 16:58:22 GMT 2009 Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
|
||||||
Misc QEMU driver startup fixes
|
Misc QEMU driver startup fixes
|
||||||
|
|
|
@ -432,6 +432,30 @@ virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virCapabilitiesSupportsGuestOSType:
|
||||||
|
* @caps: capabilities to query
|
||||||
|
* @ostype: OS type to search for (eg 'hvm', 'xen')
|
||||||
|
* @arch: Architecture to search for (eg, 'i686', 'x86_64')
|
||||||
|
*
|
||||||
|
* Returns non-zero if the capabilities support the
|
||||||
|
* requested operating system type
|
||||||
|
*/
|
||||||
|
extern int
|
||||||
|
virCapabilitiesSupportsGuestArch(virCapsPtr caps,
|
||||||
|
const char *ostype,
|
||||||
|
const char *arch)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i < caps->nguests ; i++) {
|
||||||
|
if (STREQ(caps->guests[i]->ostype, ostype) &&
|
||||||
|
STREQ(caps->guests[i]->arch.name, arch))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virCapabilitiesDefaultGuestArch:
|
* virCapabilitiesDefaultGuestArch:
|
||||||
* @caps: capabilities to query
|
* @caps: capabilities to query
|
||||||
|
|
|
@ -162,6 +162,12 @@ virCapabilitiesAddGuestFeature(virCapsGuestPtr guest,
|
||||||
extern int
|
extern int
|
||||||
virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
|
virCapabilitiesSupportsGuestOSType(virCapsPtr caps,
|
||||||
const char *ostype);
|
const char *ostype);
|
||||||
|
extern int
|
||||||
|
virCapabilitiesSupportsGuestArch(virCapsPtr caps,
|
||||||
|
const char *ostype,
|
||||||
|
const char *arch);
|
||||||
|
|
||||||
|
|
||||||
extern const char *
|
extern const char *
|
||||||
virCapabilitiesDefaultGuestArch(virCapsPtr caps,
|
virCapabilitiesDefaultGuestArch(virCapsPtr caps,
|
||||||
const char *ostype);
|
const char *ostype);
|
||||||
|
|
|
@ -2038,7 +2038,14 @@ static virDomainDefPtr virDomainDefParseXML(virConnectPtr conn,
|
||||||
}
|
}
|
||||||
|
|
||||||
def->os.arch = virXPathString(conn, "string(./os/type[1]/@arch)", ctxt);
|
def->os.arch = virXPathString(conn, "string(./os/type[1]/@arch)", ctxt);
|
||||||
if (!def->os.arch) {
|
if (def->os.arch) {
|
||||||
|
if (!virCapabilitiesSupportsGuestArch(caps, def->os.type, def->os.arch)) {
|
||||||
|
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("os type '%s' & arch '%s' combination is not supported"),
|
||||||
|
def->os.type, def->os.arch);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
const char *defaultArch = virCapabilitiesDefaultGuestArch(caps, def->os.type);
|
const char *defaultArch = virCapabilitiesDefaultGuestArch(caps, def->os.type);
|
||||||
if (defaultArch == NULL) {
|
if (defaultArch == NULL) {
|
||||||
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
|
||||||
|
|
|
@ -837,8 +837,16 @@ int qemudBuildCommandLine(virConnectPtr conn,
|
||||||
|
|
||||||
ADD_ARG_LIT(emulator);
|
ADD_ARG_LIT(emulator);
|
||||||
ADD_ARG_LIT("-S");
|
ADD_ARG_LIT("-S");
|
||||||
|
|
||||||
|
/* This should *never* be NULL, since we always provide
|
||||||
|
* a machine in the capabilities data for QEMU. So this
|
||||||
|
* check is just here as a safety in case the unexpected
|
||||||
|
* happens */
|
||||||
|
if (vm->def->os.machine) {
|
||||||
ADD_ARG_LIT("-M");
|
ADD_ARG_LIT("-M");
|
||||||
ADD_ARG_LIT(vm->def->os.machine);
|
ADD_ARG_LIT(vm->def->os.machine);
|
||||||
|
}
|
||||||
|
|
||||||
if (disableKQEMU)
|
if (disableKQEMU)
|
||||||
ADD_ARG_LIT("-no-kqemu");
|
ADD_ARG_LIT("-no-kqemu");
|
||||||
ADD_ARG_LIT("-m");
|
ADD_ARG_LIT("-m");
|
||||||
|
|
Loading…
Reference in New Issue