diff mbox series

net/vhost-net: do not assert on null pointer return from tap_get_vhost_net()

Message ID 20230628112804.36676-1-anisinha@redhat.com
State New
Headers show
Series net/vhost-net: do not assert on null pointer return from tap_get_vhost_net() | expand

Commit Message

Ani Sinha June 28, 2023, 11:28 a.m. UTC
When 'vhost=off' or no vhost specific options at all are passed for the tap
net-device backend, tap_get_vhost_net() can return NULL. The function
net_init_tap_one() does not call vhost_net_init() on such cases and therefore
vhost_net pointer within the tap device state structure remains NULL. Hence,
assertion here on a NULL pointer return from tap_get_vhost_net() would not be
correct. Remove it and fix the crash generated by qemu upon initialization in
the following call chain :

qdev_realize() -> pci_qdev_realize() -> virtio_device_realize() ->
virtio_bus_device_plugged() -> virtio_net_get_features() -> get_vhost_net()

fixes: 0e994668d00c9c ("vhost_net: add an assertion for TAP client backends")
Signed-off-by: Ani Sinha <anisinha@redhat.com>
---
 hw/net/vhost_net.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Bacchus June 28, 2023, 11:31 a.m. UTC | #1
On 6/28/23 13:28, Ani Sinha wrote:
> When 'vhost=off' or no vhost specific options at all are passed for the tap
> net-device backend, tap_get_vhost_net() can return NULL. The function
> net_init_tap_one() does not call vhost_net_init() on such cases and therefore
> vhost_net pointer within the tap device state structure remains NULL. Hence,
> assertion here on a NULL pointer return from tap_get_vhost_net() would not be
> correct. Remove it and fix the crash generated by qemu upon initialization in
> the following call chain :
> 
> qdev_realize() -> pci_qdev_realize() -> virtio_device_realize() ->
> virtio_bus_device_plugged() -> virtio_net_get_features() -> get_vhost_net()
> 
> fixes: 0e994668d00c9c ("vhost_net: add an assertion for TAP client backends")
> Signed-off-by: Ani Sinha <anisinha@redhat.com>

Reviewed-by: Cédric Le Goater <clg@redhat.com>
Tested-by: Cédric Le Goater <clg@redhat.com>

Thanks !

C.


> ---
>   hw/net/vhost_net.c | 7 ++++++-
>   1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index 6db23ca323..6b958d6363 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -507,7 +507,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>       switch (nc->info->type) {
>       case NET_CLIENT_DRIVER_TAP:
>           vhost_net = tap_get_vhost_net(nc);
> -        assert(vhost_net);
> +        /*
> +         * tap_get_vhost_net() can return NULL if a tap net-device backend is
> +         * created with 'vhost=off' option, 'vhostforce=off' or no vhost or
> +         * vhostforce or vhostfd options at all. Please see net_init_tap_one().
> +         * Hence, we omit the assertion here.
> +         */
>           break;
>   #ifdef CONFIG_VHOST_NET_USER
>       case NET_CLIENT_DRIVER_VHOST_USER:
Michael S. Tsirkin June 28, 2023, 11:42 a.m. UTC | #2
On Wed, Jun 28, 2023 at 04:58:04PM +0530, Ani Sinha wrote:
> When 'vhost=off' or no vhost specific options at all are passed for the tap
> net-device backend, tap_get_vhost_net() can return NULL. The function
> net_init_tap_one() does not call vhost_net_init() on such cases and therefore
> vhost_net pointer within the tap device state structure remains NULL. Hence,
> assertion here on a NULL pointer return from tap_get_vhost_net() would not be
> correct. Remove it and fix the crash generated by qemu upon initialization in
> the following call chain :
> 
> qdev_realize() -> pci_qdev_realize() -> virtio_device_realize() ->
> virtio_bus_device_plugged() -> virtio_net_get_features() -> get_vhost_net()
> 
> fixes: 0e994668d00c9c ("vhost_net: add an assertion for TAP client backends")
> Signed-off-by: Ani Sinha <anisinha@redhat.com>

I added a bunch of tags and sent it upstream. Take a look
at the pull request so you can do it yourself going
forward, pls.

> ---
>  hw/net/vhost_net.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
> index 6db23ca323..6b958d6363 100644
> --- a/hw/net/vhost_net.c
> +++ b/hw/net/vhost_net.c
> @@ -507,7 +507,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>      switch (nc->info->type) {
>      case NET_CLIENT_DRIVER_TAP:
>          vhost_net = tap_get_vhost_net(nc);
> -        assert(vhost_net);
> +        /*
> +         * tap_get_vhost_net() can return NULL if a tap net-device backend is
> +         * created with 'vhost=off' option, 'vhostforce=off' or no vhost or
> +         * vhostforce or vhostfd options at all. Please see net_init_tap_one().
> +         * Hence, we omit the assertion here.
> +         */
>          break;
>  #ifdef CONFIG_VHOST_NET_USER
>      case NET_CLIENT_DRIVER_VHOST_USER:
> -- 
> 2.39.1
Ani Sinha June 28, 2023, 11:44 a.m. UTC | #3
> On 28-Jun-2023, at 5:12 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
> 
> On Wed, Jun 28, 2023 at 04:58:04PM +0530, Ani Sinha wrote:
>> When 'vhost=off' or no vhost specific options at all are passed for the tap
>> net-device backend, tap_get_vhost_net() can return NULL. The function
>> net_init_tap_one() does not call vhost_net_init() on such cases and therefore
>> vhost_net pointer within the tap device state structure remains NULL. Hence,
>> assertion here on a NULL pointer return from tap_get_vhost_net() would not be
>> correct. Remove it and fix the crash generated by qemu upon initialization in
>> the following call chain :
>> 
>> qdev_realize() -> pci_qdev_realize() -> virtio_device_realize() ->
>> virtio_bus_device_plugged() -> virtio_net_get_features() -> get_vhost_net()
>> 
>> fixes: 0e994668d00c9c ("vhost_net: add an assertion for TAP client backends")
>> Signed-off-by: Ani Sinha <anisinha@redhat.com>
> 
> I added a bunch of tags and sent it upstream. Take a look
> at the pull request so you can do it yourself going
> forward, pls.

I thought only maintainers sends PR? Do you have any handy scripts?

> 
>> ---
>> hw/net/vhost_net.c | 7 ++++++-
>> 1 file changed, 6 insertions(+), 1 deletion(-)
>> 
>> diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
>> index 6db23ca323..6b958d6363 100644
>> --- a/hw/net/vhost_net.c
>> +++ b/hw/net/vhost_net.c
>> @@ -507,7 +507,12 @@ VHostNetState *get_vhost_net(NetClientState *nc)
>>     switch (nc->info->type) {
>>     case NET_CLIENT_DRIVER_TAP:
>>         vhost_net = tap_get_vhost_net(nc);
>> -        assert(vhost_net);
>> +        /*
>> +         * tap_get_vhost_net() can return NULL if a tap net-device backend is
>> +         * created with 'vhost=off' option, 'vhostforce=off' or no vhost or
>> +         * vhostforce or vhostfd options at all. Please see net_init_tap_one().
>> +         * Hence, we omit the assertion here.
>> +         */
>>         break;
>> #ifdef CONFIG_VHOST_NET_USER
>>     case NET_CLIENT_DRIVER_VHOST_USER:
>> -- 
>> 2.39.1
>
Philippe Mathieu-Daudé June 28, 2023, 11:50 a.m. UTC | #4
On 28/6/23 13:44, Ani Sinha wrote:
> 
> 
>> On 28-Jun-2023, at 5:12 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
>>
>> On Wed, Jun 28, 2023 at 04:58:04PM +0530, Ani Sinha wrote:
>>> When 'vhost=off' or no vhost specific options at all are passed for the tap
>>> net-device backend, tap_get_vhost_net() can return NULL. The function
>>> net_init_tap_one() does not call vhost_net_init() on such cases and therefore
>>> vhost_net pointer within the tap device state structure remains NULL. Hence,
>>> assertion here on a NULL pointer return from tap_get_vhost_net() would not be
>>> correct. Remove it and fix the crash generated by qemu upon initialization in
>>> the following call chain :
>>>
>>> qdev_realize() -> pci_qdev_realize() -> virtio_device_realize() ->
>>> virtio_bus_device_plugged() -> virtio_net_get_features() -> get_vhost_net()
>>>
>>> fixes: 0e994668d00c9c ("vhost_net: add an assertion for TAP client backends")
>>> Signed-off-by: Ani Sinha <anisinha@redhat.com>
>>
>> I added a bunch of tags and sent it upstream. Take a look
>> at the pull request so you can do it yourself going
>> forward, pls.
> 
> I thought only maintainers sends PR? Do you have any handy scripts?

https://github.com/stefanha/git-publish/blob/master/git-publish.pod#sending-pull-requests
Ani Sinha June 28, 2023, 2:52 p.m. UTC | #5
> On 28-Jun-2023, at 5:20 PM, Philippe Mathieu-Daudé <philmd@linaro.org> wrote:
> 
> On 28/6/23 13:44, Ani Sinha wrote:
>>> On 28-Jun-2023, at 5:12 PM, Michael S. Tsirkin <mst@redhat.com> wrote:
>>> 
>>> On Wed, Jun 28, 2023 at 04:58:04PM +0530, Ani Sinha wrote:
>>>> When 'vhost=off' or no vhost specific options at all are passed for the tap
>>>> net-device backend, tap_get_vhost_net() can return NULL. The function
>>>> net_init_tap_one() does not call vhost_net_init() on such cases and therefore
>>>> vhost_net pointer within the tap device state structure remains NULL. Hence,
>>>> assertion here on a NULL pointer return from tap_get_vhost_net() would not be
>>>> correct. Remove it and fix the crash generated by qemu upon initialization in
>>>> the following call chain :
>>>> 
>>>> qdev_realize() -> pci_qdev_realize() -> virtio_device_realize() ->
>>>> virtio_bus_device_plugged() -> virtio_net_get_features() -> get_vhost_net()
>>>> 
>>>> fixes: 0e994668d00c9c ("vhost_net: add an assertion for TAP client backends")
>>>> Signed-off-by: Ani Sinha <anisinha@redhat.com>
>>> 
>>> I added a bunch of tags and sent it upstream. Take a look
>>> at the pull request so you can do it yourself going
>>> forward, pls.
>> I thought only maintainers sends PR? Do you have any handy scripts?
> 
> https://github.com/stefanha/git-publish/blob/master/git-publish.pod#sending-pull-requests

Cool! Thanks Phil! Will check this and talk to Stefan.
diff mbox series

Patch

diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c
index 6db23ca323..6b958d6363 100644
--- a/hw/net/vhost_net.c
+++ b/hw/net/vhost_net.c
@@ -507,7 +507,12 @@  VHostNetState *get_vhost_net(NetClientState *nc)
     switch (nc->info->type) {
     case NET_CLIENT_DRIVER_TAP:
         vhost_net = tap_get_vhost_net(nc);
-        assert(vhost_net);
+        /*
+         * tap_get_vhost_net() can return NULL if a tap net-device backend is
+         * created with 'vhost=off' option, 'vhostforce=off' or no vhost or
+         * vhostforce or vhostfd options at all. Please see net_init_tap_one().
+         * Hence, we omit the assertion here.
+         */
         break;
 #ifdef CONFIG_VHOST_NET_USER
     case NET_CLIENT_DRIVER_VHOST_USER: