[Mesa-dev] [PATCH 2/2] i965/tiled_memcpy: Protect against wrong alignments
Jason Ekstrand
jason at jlekstrand.net
Tue Apr 5 01:04:49 UTC 2016
It's possible, when doing an x-tiled copy, to end up with a case where the
bytes parameter is equal to 16 but the pointer is not actually aligned.
This causes asserts in debug mode and segfaults in release builds due to
doing an aligned operation on an unaligned pointer.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93962
---
src/mesa/drivers/dri/i965/intel_tiled_memcpy.c | 48 +++++++++++++-------------
1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c b/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c
index 19079d0..823d8b0 100644
--- a/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c
+++ b/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c
@@ -85,19 +85,19 @@ rgba8_copy_aligned_dst(void *dst, const void *src, size_t bytes)
uint8_t const *s = src;
#ifdef __SSSE3__
- if (bytes == 16) {
- assert(!(((uintptr_t)dst) & 0xf));
- rgba8_copy_16_aligned_dst(d+ 0, s+ 0);
- return dst;
- }
+ if ((((uintptr_t)dst) & 0xf) == 0) {
+ if (bytes == 16) {
+ rgba8_copy_16_aligned_dst(d+ 0, s+ 0);
+ return dst;
+ }
- if (bytes == 64) {
- assert(!(((uintptr_t)dst) & 0xf));
- rgba8_copy_16_aligned_dst(d+ 0, s+ 0);
- rgba8_copy_16_aligned_dst(d+16, s+16);
- rgba8_copy_16_aligned_dst(d+32, s+32);
- rgba8_copy_16_aligned_dst(d+48, s+48);
- return dst;
+ if (bytes == 64) {
+ rgba8_copy_16_aligned_dst(d+ 0, s+ 0);
+ rgba8_copy_16_aligned_dst(d+16, s+16);
+ rgba8_copy_16_aligned_dst(d+32, s+32);
+ rgba8_copy_16_aligned_dst(d+48, s+48);
+ return dst;
+ }
}
#endif
@@ -123,19 +123,19 @@ rgba8_copy_aligned_src(void *dst, const void *src, size_t bytes)
uint8_t const *s = src;
#ifdef __SSSE3__
- if (bytes == 16) {
- assert(!(((uintptr_t)src) & 0xf));
- rgba8_copy_16_aligned_src(d+ 0, s+ 0);
- return dst;
- }
+ if ((((uintptr_t)src) & 0xf) == 0) {
+ if (bytes == 16) {
+ rgba8_copy_16_aligned_src(d+ 0, s+ 0);
+ return dst;
+ }
- if (bytes == 64) {
- assert(!(((uintptr_t)src) & 0xf));
- rgba8_copy_16_aligned_src(d+ 0, s+ 0);
- rgba8_copy_16_aligned_src(d+16, s+16);
- rgba8_copy_16_aligned_src(d+32, s+32);
- rgba8_copy_16_aligned_src(d+48, s+48);
- return dst;
+ if (bytes == 64) {
+ rgba8_copy_16_aligned_src(d+ 0, s+ 0);
+ rgba8_copy_16_aligned_src(d+16, s+16);
+ rgba8_copy_16_aligned_src(d+32, s+32);
+ rgba8_copy_16_aligned_src(d+48, s+48);
+ return dst;
+ }
}
#endif
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list