Module: Mesa Branch: staging/20.0 Commit: 3ab95d1846114c9f56198d734896a3e840affb37 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3ab95d1846114c9f56198d734896a3e840affb37
Author: Caio Marcelo de Oliveira Filho <[email protected]> Date: Wed Mar 18 17:14:19 2020 -0700 mesa/main: Fix overflow in validation of DispatchComputeGroupSizeARB An uint64_t can store the result of multiplying two GLuint (uint32_t), so use that property to check for overflow when calculating the total. Change the error message so we don't need to care about the actual total -- which means we don't need a larger than 64-bit value to hold it. Fixes: 45ab63c0cb2 ("mesa/main: add support for ARB_compute_variable_groups_size") Reviewed-by: Samuel Pitoiset <[email protected]> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4240> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4240> (cherry picked from commit fdc603292862dd2663b75d18e9abc6096b8020ff) --- .pick_status.json | 2 +- src/mesa/main/compute.c | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 3528d8c73fd..de4b3c2d87a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -130,7 +130,7 @@ "description": "mesa/main: Fix overflow in validation of DispatchComputeGroupSizeARB", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "45ab63c0cb274b20a7ae1f390b123e13a5b46c98" }, diff --git a/src/mesa/main/compute.c b/src/mesa/main/compute.c index cbd166b1095..ca5389dcf5c 100644 --- a/src/mesa/main/compute.c +++ b/src/mesa/main/compute.c @@ -103,8 +103,6 @@ validate_DispatchComputeGroupSizeARB(struct gl_context *ctx, const GLuint *num_groups, const GLuint *group_size) { - GLuint total_invocations = 1; - if (!check_valid_to_compute(ctx, "glDispatchComputeGroupSizeARB")) return GL_FALSE; @@ -153,8 +151,6 @@ validate_DispatchComputeGroupSizeARB(struct gl_context *ctx, "glDispatchComputeGroupSizeARB(group_size_%c)", 'x' + i); return GL_FALSE; } - - total_invocations *= group_size[i]; } /* The ARB_compute_variable_group_size spec says: @@ -165,11 +161,19 @@ validate_DispatchComputeGroupSizeARB(struct gl_context *ctx, * for compute shaders with variable group size * (MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB)." */ + uint64_t total_invocations = group_size[0] * group_size[1]; + if (total_invocations <= UINT32_MAX) { + /* Only bother multiplying the third value if total still fits in + * 32-bit, since MaxComputeVariableGroupInvocations is also 32-bit. + */ + total_invocations *= group_size[2]; + } if (total_invocations > ctx->Const.MaxComputeVariableGroupInvocations) { _mesa_error(ctx, GL_INVALID_VALUE, "glDispatchComputeGroupSizeARB(product of local_sizes " "exceeds MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB " - "(%d > %d))", total_invocations, + "(%u * %u * %u > %u))", + group_size[0], group_size[1], group_size[2], ctx->Const.MaxComputeVariableGroupInvocations); return GL_FALSE; } _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
