summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Gawin <filip.gawin@collabora.com>2023-09-15 15:16:49 +0200
committerMarge Bot <emma+marge@anholt.net>2023-09-18 07:52:17 +0000
commit4da1859f07b8a47b12035d6d284ee7bae379be9c (patch)
tree7c9afbe24ec8a189648a99267cfd31ea0be3171c
parent6f6a81dce68d6a308ee408db57997fa5d31c34d1 (diff)
vrend: Use uint64_t to evaluate readback size
in vrend_renderer_transfer_write_iov Part-of: <https://gitlab.freedesktop.org/virgl/virglrenderer/-/merge_requests/1238>
-rw-r--r--src/vrend_renderer.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 4abc3cf..f8ded20 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -8952,7 +8952,7 @@ static int vrend_renderer_transfer_write_iov(struct vrend_context *ctx,
bool compressed;
bool invert = false;
float depth_scale;
- GLuint send_size = 0;
+ uint64_t send_size = 0;
uint32_t stride = info->stride;
uint32_t layer_stride = info->layer_stride;
@@ -8981,7 +8981,9 @@ static int vrend_renderer_transfer_write_iov(struct vrend_context *ctx,
}
send_size = util_format_get_nblocks(res->base.format, info->box->width,
- info->box->height) * elsize;
+ info->box->height);
+ send_size *= elsize;
+
if (res->target == GL_TEXTURE_3D ||
res->target == GL_TEXTURE_1D_ARRAY ||
res->target == GL_TEXTURE_2D_ARRAY ||
@@ -8992,9 +8994,19 @@ static int vrend_renderer_transfer_write_iov(struct vrend_context *ctx,
return EINVAL;
if (need_temp) {
+ /* functions like glCompressedTexSubImage3D only support
+ * a buffer size of GLsizei = uint32_t, anything larger
+ * is bogous */
+ if (send_size > UINT_MAX) {
+ virgl_error("Used write size out of range %"PRIu64"\n", send_size);
+ return EINVAL;
+ }
+
data = malloc(send_size);
- if (!data)
+ if (!data) {
+ virgl_error("Memory allocation failed for %"PRIu64"\n", send_size);
return ENOMEM;
+ }
read_transfer_data(iov, num_iovs, data, res->base.format, info->offset,
stride, layer_stride, info->box, invert);
} else {