Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:
- [High] The local variable `bridge` is passed to 
`drm_of_find_panel_or_bridge()` without initialization, leading to a crash when 
the function returns an error without setting it.
--

--- Patch [1]: [PATCH v3 1/2] drm/logicvc: Avoid use-after-free with 
devm_kzalloc() ---
commit 95ef468f51e9bfed648e230bd616663ec7bac106
Author: Romain Gantois <[email protected]>

drm/logicvc: Avoid use-after-free with devm_kzalloc()

This commit transitions the panel, CRTC, and encoder objects to DRM-managed
allocations. It removes devm_kzalloc usages in order to fix a use-after-free
bug.

> diff --git a/drivers/gpu/drm/logicvc/logicvc_interface.c 
> b/drivers/gpu/drm/logicvc/logicvc_interface.c
> --- a/drivers/gpu/drm/logicvc/logicvc_interface.c
> +++ b/drivers/gpu/drm/logicvc/logicvc_interface.c
> @@ -147,36 +143,35 @@ int logicvc_interface_init(struct logicvc_drm *logicvc)
>       int encoder_type = logicvc_interface_encoder_type(logicvc);
>       int connector_type = logicvc_interface_connector_type(logicvc);
>       bool native_connector = logicvc_interface_native_connector(logicvc);
> +     struct drm_bridge *bridge;
> +     struct drm_panel *panel;
>       int ret;
>  
> -     interface = devm_kzalloc(dev, sizeof(*interface), GFP_KERNEL);
> -     if (!interface) {
> -             ret = -ENOMEM;
> -             goto error_early;
> -     }
> -
> -     ret = drm_of_find_panel_or_bridge(of_node, 0, 0, &interface->drm_panel,
> -                                       &interface->drm_bridge);
> +     ret = drm_of_find_panel_or_bridge(of_node, 0, 0, &panel,
> +                                       &bridge);
>       if (ret == -EPROBE_DEFER)
> -             goto error_early;

[Severity: High]
Are panel and bridge guaranteed to be initialized if this call fails?

When drm_of_find_panel_or_bridge() returns an error like -ENODEV (which
is valid for native DVI connectors without an OF graph), it might not
initialize these variables. Previously, interface was allocated with
devm_kzalloc(), so they were safely initialized to NULL. Now, they are
uninitialized stack variables.

> -     ret = drm_encoder_init(drm_dev, &interface->drm_encoder,
> -                            &logicvc_encoder_funcs, encoder_type, NULL);
> -     if (ret) {
> +     interface = drmm_encoder_alloc(drm_dev, struct logicvc_interface, 
> drm_encoder,
> +                                    NULL, encoder_type, NULL);
> +     if (IS_ERR(interface)) {
>               drm_err(drm_dev, "Failed to initialize encoder\n");
> -             goto error_early;
> +             return PTR_ERR(interface);
>       }
>  
> +     interface->drm_panel = panel;
> +     interface->drm_bridge = bridge;

[Severity: High]
Could this assignment cause a crash later during driver initialization?

If drm_of_find_panel_or_bridge() returned -ENODEV, bridge will contain
stack garbage. Later in logicvc_interface_init(), the code evaluates
if (interface->drm_bridge) and calls drm_bridge_attach(), which would
dereference this uninitialized pointer and trigger a kernel panic.

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=1

Reply via email to