Skip to content

Commit

Permalink
drm/amd/display: handle failed allocation during stream construction
Browse files Browse the repository at this point in the history
[Why]
Failing to allocate a transfer function during stream construction leads
to a null pointer dereference

[How]
Handle the failed allocation by failing the stream construction

Cc: stable@vger.kernel.org
Signed-off-by: Josip Pavic <Josip.Pavic@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Josip Pavic authored and Alex Deucher committed Jul 14, 2020
1 parent b448d30 commit be73e60
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions drivers/gpu/drm/amd/display/dc/core/dc_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink)
}
}

static void dc_stream_construct(struct dc_stream_state *stream,
static bool dc_stream_construct(struct dc_stream_state *stream,
struct dc_sink *dc_sink_data)
{
uint32_t i = 0;
Expand Down Expand Up @@ -118,11 +118,17 @@ static void dc_stream_construct(struct dc_stream_state *stream,
update_stream_signal(stream, dc_sink_data);

stream->out_transfer_func = dc_create_transfer_func();
if (stream->out_transfer_func == NULL) {
dc_sink_release(dc_sink_data);
return false;
}
stream->out_transfer_func->type = TF_TYPE_BYPASS;
stream->out_transfer_func->ctx = stream->ctx;

stream->stream_id = stream->ctx->dc_stream_id_count;
stream->ctx->dc_stream_id_count++;

return true;
}

static void dc_stream_destruct(struct dc_stream_state *stream)
Expand Down Expand Up @@ -164,13 +170,20 @@ struct dc_stream_state *dc_create_stream_for_sink(

stream = kzalloc(sizeof(struct dc_stream_state), GFP_KERNEL);
if (stream == NULL)
return NULL;
goto alloc_fail;

dc_stream_construct(stream, sink);
if (dc_stream_construct(stream, sink) == false)
goto construct_fail;

kref_init(&stream->refcount);

return stream;

construct_fail:
kfree(stream);

alloc_fail:
return NULL;
}

struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream)
Expand Down

0 comments on commit be73e60

Please sign in to comment.