The function dc_stream_set_cursor_attributes() currently dereferences
the `stream` pointer and nested members `stream->ctx->dc->current_state`
without checking for NULL.

All callers of these functions, such as in
`dcn30_apply_idle_power_optimizations()` and
`amdgpu_dm_plane_handle_cursor_update()`, already perform NULL checks
before calling these functions.

Fixes below:
drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.c:336 
dc_stream_program_cursor_attributes()
error: we previously assumed 'stream' could be null (see line 334)

drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.c
    327 bool dc_stream_program_cursor_attributes(
    328         struct dc_stream_state *stream,
    329         const struct dc_cursor_attributes *attributes)
    330 {
    331         struct dc  *dc;
    332         bool reset_idle_optimizations = false;
    333
    334         dc = stream ? stream->ctx->dc : NULL;
                     ^^^^^^
The old code assumed stream could be NULL.

    335
--> 336         if (dc_stream_set_cursor_attributes(stream, attributes)) {
                                                    ^^^^^^
The refactor added an unchecked dereference.

drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc_stream.c
   313  bool dc_stream_set_cursor_attributes(
   314          struct dc_stream_state *stream,
   315          const struct dc_cursor_attributes *attributes)
   316  {
   317          bool result = false;
   318
   319          if (dc_stream_check_cursor_attributes(stream, 
stream->ctx->dc->current_state, attributes)) {
                                                              
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Here.
This function used to check for if stream as NULL and return false at
the start. Probably we should add that back.

'Fixes: 4465dd0e41e8 ("drm/amd/display: Refactor SubVP cursor limiting logic")'
Reported-by: Dan Carpenter <[email protected]>
Cc: Alex Hung <[email protected]>
Cc: Alvin Lee <[email protected]>
Cc: Ray Wu <[email protected]>
Cc: Dillon Varone <[email protected]>
Cc: Aurabindo Pillai <[email protected]>
Cc: Roman Li <[email protected]>
Cc: ChiaHsuan Chung <[email protected]>
Cc: Harry Wentland <[email protected]>
Cc: Daniel Wheeler <[email protected]>
Cc: Tom Chung <[email protected]>
Cc: Wenjing Liu <[email protected]>
Cc: Jun Lei <[email protected]>
Signed-off-by: Srinivasan Shanmugam <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc_stream.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c 
b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 4d6bc9fd4faa..9ac2d41f8fca 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -316,6 +316,9 @@ bool dc_stream_set_cursor_attributes(
 {
        bool result = false;
 
+       if (!stream)
+               return false;
+
        if (dc_stream_check_cursor_attributes(stream, 
stream->ctx->dc->current_state, attributes)) {
                stream->cursor_attributes = *attributes;
                result = true;
@@ -331,7 +334,10 @@ bool dc_stream_program_cursor_attributes(
        struct dc  *dc;
        bool reset_idle_optimizations = false;
 
-       dc = stream ? stream->ctx->dc : NULL;
+       if (!stream)
+               return false;
+
+       dc = stream->ctx->dc;
 
        if (dc_stream_set_cursor_attributes(stream, attributes)) {
                dc_z10_restore(dc);
-- 
2.34.1

Reply via email to