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 <sroland@vmware.com>
This commit is contained in:
Jose Fonseca 2017-07-24 14:20:03 +01:00
parent c3ea898932
commit 8d655263ca

View file

@ -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);