network: allow '-' in model name

In QEMU PPC64 we have a network device called "spapr-vlan". We can specify
this using the existing syntax for network devices, however libvirt
currently rejects "spapr-vlan" in virDomainNetDefParseXML() because of
the "-". Fix the code to accept "-".

* src/conf/domain_conf.c (virDomainNetDefParseXML): Allow '-' in
model name, and be more efficient.
* docs/schemas/domaincommon.rng: Limit valid model names to match code.
Based on a patch by Michael Ellerman.
This commit is contained in:
Eric Blake 2011-12-08 17:41:22 +11:00
parent a7adac3730
commit dad3c2090d
2 changed files with 13 additions and 9 deletions

View File

@ -1276,7 +1276,11 @@
</optional>
<optional>
<element name="model">
<attribute name="type"/>
<attribute name="type">
<data type="string">
<param name='pattern'>[a-zA-Z0-9\-_]+</param>
</data>
</attribute>
<empty/>
</element>
</optional>

View File

@ -3385,6 +3385,9 @@ error:
return ret;
}
#define NET_MODEL_CHARS \
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ091234567890_-"
/* Parse the XML definition for a network interface
* @param node XML nodeset to parse for net definition
* @return 0 on success, -1 on failure
@ -3699,16 +3702,13 @@ virDomainNetDefParseXML(virCapsPtr caps,
* reasonable, not that it is a supported NIC type. FWIW kvm
* supports these types as of April 2008:
* i82551 i82557b i82559er ne2k_pci pcnet rtl8139 e1000 virtio
* QEMU PPC64 supports spapr-vlan
*/
if (model != NULL) {
int i;
for (i = 0 ; i < strlen(model) ; i++) {
int char_ok = c_isalnum(model[i]) || model[i] == '_';
if (!char_ok) {
virDomainReportError(VIR_ERR_INVALID_ARG, "%s",
_("Model name contains invalid characters"));
goto error;
}
if (strspn(model, NET_MODEL_CHARS) < strlen(model)) {
virDomainReportError(VIR_ERR_INVALID_ARG, "%s",
_("Model name contains invalid characters"));
goto error;
}
def->model = model;
model = NULL;