From: Paolo Bonzini <pbonz...@redhat.com> When a network or network device is created from the command line or HMP, QemuOpts ensures that the id passes the id_wellformed check. However, QMP skips this:
$ qemu-system-x86_64 -qmp stdio -S -nic user,id=123/456 qemu-system-x86_64: -nic user,id=123/456: Parameter id expects an identifier Identifiers consist of letters, digits, -, ., _, starting with a letter. $ qemu-system-x86_64 -qmp stdio -S {"execute":"qmp_capabilities"} {"return": {}} {"execute":"netdev_add", "arguments": {"type": "user", "id": "123/456"}} {"return": {}} After: $ qemu-system-x86_64 -qmp stdio -S {"execute":"qmp_capabilities"} {"return": {}} {"execute":"netdev_add", "arguments": {"type": "user", "id": "123/456"}} {"error": {"class": "GenericError", "desc": "Parameter "id" expects an identifier"}} Validity checks should be performed always at the bottom of the call chain, because QMP skips all the steps above. Do this for the network subsystem. Cc: Jason Wang <jasow...@redhat.com> Reviewed-by: Eric Blake <ebl...@redhat.com> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> Signed-off-by: Jason Wang <jasow...@redhat.com> --- net/net.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/net/net.c b/net/net.c index 9c784da..d36729f 100644 --- a/net/net.c +++ b/net/net.c @@ -44,6 +44,7 @@ #include "qemu/cutils.h" #include "qemu/config-file.h" #include "qemu/ctype.h" +#include "qemu/id.h" #include "qemu/iov.h" #include "qemu/qemu-print.h" #include "qemu/main-loop.h" @@ -1011,6 +1012,17 @@ static int net_client_init1(const Netdev *netdev, bool is_netdev, Error **errp) } } + /* + * The id for -net has already been checked by QemuOpts and + * could be automatically generated, in which case it is not + * well-formed by design. HMP and QMP only call us with + * is_netdev == true. + */ + if (is_netdev && !id_wellformed(netdev->id)) { + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "id", "an identifier"); + return -1; + } + nc = qemu_find_netdev(netdev->id); if (nc) { error_setg(errp, "Duplicate ID '%s'", netdev->id); -- 2.7.4