[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 03/16] net: validate that ids are well formed
From: |
Jason Wang |
Subject: |
[PULL 03/16] net: validate that ids are well formed |
Date: |
Fri, 12 Mar 2021 14:16:13 +0800 |
From: Paolo Bonzini <pbonzini@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 <jasowang@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Jason Wang <jasowang@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
- [PULL 00/16] Net patches, Jason Wang, 2021/03/12
- [PULL 04/16] net: unbreak well-form id check for "-nic", Jason Wang, 2021/03/12
- [PULL 06/16] net: introduce qemu_receive_packet(), Jason Wang, 2021/03/12
- [PULL 05/16] e1000: fail early for evil descriptor, Jason Wang, 2021/03/12
- [PULL 07/16] e1000: switch to use qemu_receive_packet() for loopback, Jason Wang, 2021/03/12
- [PULL 08/16] dp8393x: switch to use qemu_receive_packet() for loopback packet, Jason Wang, 2021/03/12
- [PULL 09/16] msf2-mac: switch to use qemu_receive_packet() for loopback, Jason Wang, 2021/03/12
- [PULL 10/16] sungem: switch to use qemu_receive_packet() for loopback, Jason Wang, 2021/03/12