[PATCH] net: validate that ids are well formed

Paolo Bonzini posted 1 patch 3 years, 2 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210301145658.286342-1-pbonzini@redhat.com
Maintainers: Jason Wang <jasowang@redhat.com>
There is a newer version of this series
net/net.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
[PATCH] net: validate that ids are well formed
Posted by Paolo Bonzini 3 years, 2 months ago
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>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 net/net.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/net/net.c b/net/net.c
index fb7b7dcc25..f7835aa0a8 100644
--- a/net/net.c
+++ b/net/net.c
@@ -43,6 +43,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.26.2


Re: [PATCH] net: validate that ids are well formed
Posted by Eric Blake 3 years, 2 months ago
On 3/1/21 8:56 AM, Paolo Bonzini wrote:
> 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>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  net/net.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org


Re: [PATCH] net: validate that ids are well formed
Posted by Jason Wang 3 years, 2 months ago
On 2021/3/1 11:07 下午, Eric Blake wrote:
> On 3/1/21 8:56 AM, Paolo Bonzini wrote:
>> 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>
>> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>> ---
>>   net/net.c | 12 ++++++++++++
>>   1 file changed, 12 insertions(+)
> Reviewed-by: Eric Blake <eblake@redhat.com>


Queued.

Thanks


>