mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 06:10:13 +01:00
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:
parent
c3ea898932
commit
8d655263ca
1 changed files with 8 additions and 9 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue