mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
conf: move chardev validation into virDomainDeviceDefValidateInternal
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
parent
a4ba59ff4b
commit
1e4cc18890
@ -5034,6 +5034,101 @@ virDomainDefHasUSB(const virDomainDef *def)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define SERIAL_CHANNEL_NAME_CHARS \
|
||||||
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-."
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainChrSourceDefValidate(const virDomainChrSourceDef *def,
|
||||||
|
const virDomainChrDef *chr_def)
|
||||||
|
{
|
||||||
|
switch ((virDomainChrType) def->type) {
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_NULL:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_PTY:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_VC:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_STDIO:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_LAST:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_FILE:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_DEV:
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
||||||
|
if (!def->data.file.path) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing source path attribute for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_NMDM:
|
||||||
|
if (!def->data.nmdm.master) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing master path attribute for nmdm device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!def->data.nmdm.slave) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing slave path attribute for nmdm device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_TCP:
|
||||||
|
if (!def->data.tcp.host) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing source host attribute for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!def->data.tcp.service) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing source service attribute for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_UDP:
|
||||||
|
if (!def->data.udp.connectService) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing source service attribute for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_UNIX:
|
||||||
|
/* path can be auto generated */
|
||||||
|
if (!def->data.nix.path &&
|
||||||
|
(!chr_def ||
|
||||||
|
(chr_def->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN &&
|
||||||
|
chr_def->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO))) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("Missing source path attribute for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VIR_DOMAIN_CHR_TYPE_SPICEPORT:
|
||||||
|
if (!def->data.spiceport.channel) {
|
||||||
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
|
_("Missing source channel attribute for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (strspn(def->data.spiceport.channel,
|
||||||
|
SERIAL_CHANNEL_NAME_CHARS) < strlen(def->data.spiceport.channel)) {
|
||||||
|
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
||||||
|
_("Invalid character in source channel for char device"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virDomainRedirdevDefValidate(const virDomainDef *def,
|
virDomainRedirdevDefValidate(const virDomainDef *def,
|
||||||
const virDomainRedirdevDef *redirdev)
|
const virDomainRedirdevDef *redirdev)
|
||||||
@ -5046,7 +5141,7 @@ virDomainRedirdevDefValidate(const virDomainDef *def,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return virDomainChrSourceDefValidate(redirdev->source, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5104,6 +5199,33 @@ virDomainControllerDefValidate(const virDomainControllerDef *controller)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainChrDefValidate(const virDomainChrDef *chr)
|
||||||
|
{
|
||||||
|
return virDomainChrSourceDefValidate(chr->source, chr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainSmartcardDefValidate(const virDomainSmartcardDef *smartcard)
|
||||||
|
{
|
||||||
|
if (smartcard->type == VIR_DOMAIN_SMARTCARD_TYPE_PASSTHROUGH)
|
||||||
|
return virDomainChrSourceDefValidate(smartcard->data.passthru, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
virDomainRNGDefValidate(const virDomainRNGDef *rng)
|
||||||
|
{
|
||||||
|
if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD)
|
||||||
|
return virDomainChrSourceDefValidate(rng->source.chardev, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
||||||
const virDomainDef *def)
|
const virDomainDef *def)
|
||||||
@ -5121,6 +5243,15 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
|||||||
case VIR_DOMAIN_DEVICE_CONTROLLER:
|
case VIR_DOMAIN_DEVICE_CONTROLLER:
|
||||||
return virDomainControllerDefValidate(dev->data.controller);
|
return virDomainControllerDefValidate(dev->data.controller);
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DEVICE_CHR:
|
||||||
|
return virDomainChrDefValidate(dev->data.chr);
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DEVICE_SMARTCARD:
|
||||||
|
return virDomainSmartcardDefValidate(dev->data.smartcard);
|
||||||
|
|
||||||
|
case VIR_DOMAIN_DEVICE_RNG:
|
||||||
|
return virDomainRNGDefValidate(dev->data.rng);
|
||||||
|
|
||||||
case VIR_DOMAIN_DEVICE_LEASE:
|
case VIR_DOMAIN_DEVICE_LEASE:
|
||||||
case VIR_DOMAIN_DEVICE_FS:
|
case VIR_DOMAIN_DEVICE_FS:
|
||||||
case VIR_DOMAIN_DEVICE_INPUT:
|
case VIR_DOMAIN_DEVICE_INPUT:
|
||||||
@ -5130,11 +5261,8 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev,
|
|||||||
case VIR_DOMAIN_DEVICE_WATCHDOG:
|
case VIR_DOMAIN_DEVICE_WATCHDOG:
|
||||||
case VIR_DOMAIN_DEVICE_GRAPHICS:
|
case VIR_DOMAIN_DEVICE_GRAPHICS:
|
||||||
case VIR_DOMAIN_DEVICE_HUB:
|
case VIR_DOMAIN_DEVICE_HUB:
|
||||||
case VIR_DOMAIN_DEVICE_SMARTCARD:
|
|
||||||
case VIR_DOMAIN_DEVICE_CHR:
|
|
||||||
case VIR_DOMAIN_DEVICE_MEMBALLOON:
|
case VIR_DOMAIN_DEVICE_MEMBALLOON:
|
||||||
case VIR_DOMAIN_DEVICE_NVRAM:
|
case VIR_DOMAIN_DEVICE_NVRAM:
|
||||||
case VIR_DOMAIN_DEVICE_RNG:
|
|
||||||
case VIR_DOMAIN_DEVICE_SHMEM:
|
case VIR_DOMAIN_DEVICE_SHMEM:
|
||||||
case VIR_DOMAIN_DEVICE_TPM:
|
case VIR_DOMAIN_DEVICE_TPM:
|
||||||
case VIR_DOMAIN_DEVICE_PANIC:
|
case VIR_DOMAIN_DEVICE_PANIC:
|
||||||
@ -11080,9 +11208,6 @@ virDomainChrSourceDefParseLog(virDomainChrSourceDefPtr def,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define SERIAL_CHANNEL_NAME_CHARS \
|
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-."
|
|
||||||
|
|
||||||
/* Parse the source half of the XML definition for a character device,
|
/* Parse the source half of the XML definition for a character device,
|
||||||
* where node is the first element of node->children of the parent
|
* where node is the first element of node->children of the parent
|
||||||
* element. def->type must already be valid.
|
* element. def->type must already be valid.
|
||||||
@ -11209,88 +11334,6 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ((virDomainChrType) def->type) {
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_NULL:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_PTY:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_VC:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_STDIO:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_LAST:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_FILE:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_DEV:
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_PIPE:
|
|
||||||
if (!def->data.file.path) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing source path attribute for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_NMDM:
|
|
||||||
if (!def->data.nmdm.master) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing master path attribute for nmdm device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!def->data.nmdm.slave) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing slave path attribute for nmdm device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_TCP:
|
|
||||||
if (!def->data.tcp.host) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing source host attribute for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!def->data.tcp.service) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing source service attribute for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_UDP:
|
|
||||||
if (!def->data.udp.connectService) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing source service attribute for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_UNIX:
|
|
||||||
/* path can be auto generated */
|
|
||||||
if (!def->data.nix.path &&
|
|
||||||
(!chr_def ||
|
|
||||||
(chr_def->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN &&
|
|
||||||
chr_def->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO))) {
|
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Missing source path attribute for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case VIR_DOMAIN_CHR_TYPE_SPICEPORT:
|
|
||||||
if (!def->data.spiceport.channel) {
|
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
|
||||||
_("Missing source channel attribute for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (strspn(def->data.spiceport.channel,
|
|
||||||
SERIAL_CHANNEL_NAME_CHARS) < strlen(def->data.spiceport.channel)) {
|
|
||||||
virReportError(VIR_ERR_INVALID_ARG, "%s",
|
|
||||||
_("Invalid character in source channel for char device"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user