summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/trace/tr_dump.c
diff options
context:
space:
mode:
authorJose Fonseca <[email protected]>2017-07-24 14:20:03 +0100
committerJose Fonseca <[email protected]>2017-07-25 17:18:04 +0100
commit8d655263cae8765895feec14ac0cd1ebcfdf6e3f (patch)
tree5fae1124c1be8ac80c39ecbea449935a90cb6a4d /src/gallium/drivers/trace/tr_dump.c
parentc3ea898932cb2fd408339bab103fc8ac63908320 (diff)
trace: Correct transfer box size calculation.
For textures we must not approximate the calculation with `stride * height`, or `slice_stride * depth`, as that can easily lead to buffer overflows, particularly for partial transfers. This should address the issue that Bruce Cherniak found and diagnosed. Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium/drivers/trace/tr_dump.c')
-rw-r--r--src/gallium/drivers/trace/tr_dump.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/gallium/drivers/trace/tr_dump.c b/src/gallium/drivers/trace/tr_dump.c
index 78c72492dca..2003222cc1c 100644
--- a/src/gallium/drivers/trace/tr_dump.c
+++ b/src/gallium/drivers/trace/tr_dump.c
@@ -448,23 +448,22 @@ void trace_dump_box_bytes(const void *data,
unsigned stride,
unsigned slice_stride)
{
+ enum pipe_format format = resource->format;
size_t size;
+ assert(box->height > 0);
+ assert(box->depth > 0);
+
+ size = util_format_get_nblocksx(format, box->width ) * util_format_get_blocksize(format)
+ + (util_format_get_nblocksy(format, box->height) - 1) * stride
+ + (box->depth - 1) * slice_stride;
+
/*
* Only dump buffer transfers to avoid huge files.
* TODO: Make this run-time configurable
*/
if (resource->target != PIPE_BUFFER) {
size = 0;
- } else {
- enum pipe_format format = resource->format;
- if (slice_stride)
- size = box->depth * slice_stride;
- else if (stride)
- size = util_format_get_nblocksy(format, box->height) * stride;
- else {
- size = util_format_get_nblocksx(format, box->width) * util_format_get_blocksize(format);
- }
}
trace_dump_bytes(data, size);