From 9de05fd36bc7efcda35f6fc107a58b837bc0403b Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 14 Apr 2021 15:44:16 +0200 Subject: [PATCH] zink: do not dereference NULL pointer If first_frame_done isn't set, but fence is NULL, we end up dereferncing that NULL-pointer. This can happen in the case where the first submitted batch has no work, and pfence was passed as a NULL-pointer. While we're at it, simplify the check with the surrounding code, which also checks for a NULL-pointer here. Fixes: e93ca92d4ae ("zink: force explicit fence only on first frame flush") Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/drivers/zink/zink_context.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 36e93f43831..315619dc246 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -1885,17 +1885,19 @@ zink_flush(struct pipe_context *pctx, util_queue_fence_signal(&mfence->ready); } } - if (fence && !(flags & (PIPE_FLUSH_DEFERRED | PIPE_FLUSH_ASYNC))) - sync_flush(ctx, zink_batch_state(fence)); + if (fence) { + if (!(flags & (PIPE_FLUSH_DEFERRED | PIPE_FLUSH_ASYNC))) + sync_flush(ctx, zink_batch_state(fence)); - if (flags & PIPE_FLUSH_END_OF_FRAME && !(flags & TC_FLUSH_ASYNC) && !deferred) { - /* if the first frame has not yet occurred, we need an explicit fence here - * in some cases in order to correctly draw the first frame, though it's - * unknown at this time why this is the case - */ - if (!ctx->first_frame_done) - zink_vkfence_wait(screen, fence, PIPE_TIMEOUT_INFINITE); - ctx->first_frame_done = true; + if (flags & PIPE_FLUSH_END_OF_FRAME && !(flags & TC_FLUSH_ASYNC) && !deferred) { + /* if the first frame has not yet occurred, we need an explicit fence here + * in some cases in order to correctly draw the first frame, though it's + * unknown at this time why this is the case + */ + if (!ctx->first_frame_done) + zink_vkfence_wait(screen, fence, PIPE_TIMEOUT_INFINITE); + ctx->first_frame_done = true; + } } }