Cc'ing some others

On Mon., 16 Jul. 2018, 23:33 Damir Shaikhutdinov, <
damir.shaikhutdi...@opensynergy.com> wrote:

> Hi Dave!
>
> I'm debugging virtio gpu unloading path in kernel 4.14, and found some bug
> that presents even in 4.18.
>
> In file drivers/gpu/drm/virtio/virtgpu_display.c:
>
> static void virtio_gpu_conn_destroy 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/virtio_gpu_conn_destroy>(struct
>  drm_connector 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/drm_connector> *connector){
>       struct virtio_gpu_output 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/virtio_gpu_output> 
> *virtio_gpu_output 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/virtio_gpu_output> =
>               drm_connector_to_virtio_gpu_output 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/drm_connector_to_virtio_gpu_output>(connector);
>
>       drm_connector_unregister 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/drm_connector_unregister>(connector);
>       drm_connector_cleanup 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/drm_connector_cleanup>(connector);
>       kfree 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/kfree>(virtio_gpu_output 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/virtio_gpu_output>); // 
> <--- here is the bug}
>
>
>
> https://elixir.bootlin.com/linux/v4.18-rc5/source/drivers/gpu/drm/virtio/virtgpu_display.c#L264
>
> This virtio_gpu_output pointer in this function points to a memory NOT
> allocated by k*alloc, but to an element of
> outputs array in struct virtio device.
>
> You can find the actual code that initialize connector few lines lower:
>
>       struct virtio_gpu_output 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/virtio_gpu_output> *output 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/output> = vgdev->outputs 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/outputs> + index;
>       struct drm_connector 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/drm_connector> *connector = 
> &output <https://elixir.bootlin.com/linux/v4.18-rc5/ident/output>->conn 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/conn>;
>
> ....
>         drm_connector_init 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/drm_connector_init>(dev, 
> connector, &virtio_gpu_connector_funcs 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/virtio_gpu_connector_funcs>,
>                          DRM_MODE_CONNECTOR_VIRTUAL 
> <https://elixir.bootlin.com/linux/v4.18-rc5/ident/DRM_MODE_CONNECTOR_VIRTUAL>);
>
> So, connector points to a field "conn" inside struct "virtio_gpu_output", 
> which is an element of array
> vgdev->outputs, and not something that was allocated separately.
>
> Kfree-ing it is an error.
>
>
> Can you confirm that bug?
>
>
> With best regards,
>
> Damir Shaikhutdinov
> Senior Software Engineer
>
> OpenSynergy GmbH
> Rotherstr. 20, 10245 Berlin
>
> Phone: +49 30 60 98 54 0.
> Fax:      +49 30 60 98 54 0 -99
> EMail:   damir.shaikhutdi...@opensynergy.com
> www.opensynergy.com
>
> Handelsregister/Commercial Registry: Amtsgericht Charlottenburg, HRB 108616B
> Geschäftsführung: Stefaan Sonck Thiebaut, Rolf Morich
>
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to