[Mesa-dev] [PATCH] i965: Fix segfault in WebGL Conformance on Ivybridge

Chad Versace chad.versace at linux.intel.com
Tue Nov 11 10:57:28 PST 2014


On Tue 11 Nov 2014, Ian Romanick wrote:
>On 11/10/2014 04:02 PM, Chad Versace wrote:
>>
>>        map->stride = mt->pitch;
>> -      map->ptr = base + y * map->stride + x * mt->cpp;
>> +
>> +      /* The variables in below pointer arithmetic are 32-bit. The arithmetic
>> +       * overflows for large textures.  Therefore the cast to intptr_t is
>> +       * needed.
>> +       *
>> +       * TODO(chadv): Fix this everywhere in i965 by fixing the signature of
>> +       * intel_miptree_get_image_offset() to use intptr_t.
>> +       */
>> +      map->ptr = base + (intptr_t) y * (intptr_t) map->stride
>> +                      + (intptr_t) x * (intptr_t) mt->cpp;
>
>I don't even want to know how long it took to track that down. :(

It took way too long... :(  I spent a lot of time on the wrong trail, 
trying to find errors in Mesa Core's pack/unpack routines. The bisect 
gave me the clue to where the problem was.

>Is it sufficient to just use unsigned?

No. This expression is doing pointer arithmetic. Let's move into the 
21st century and just use intptr_t and uintptr_t for pointer arithmetic.

Just using a 32-bit unsigned here may fix this particular bug, but still
leaves the door open for future buckets-of-fun debugging sessions.

Let's do the right thing and use a C99 pointer-width type.

> y and map->stride are the
>problematic values here.  Isn't y bounded by (basically) 2*8192 and
>map->stride bounded by 16*8192?  That sounds like 0x80000000, which is
>negative.

>It seems like we could have similar problems in many places, and I'd
>like to figure out what the correct coding practices are to avoid it.

I believe the correct coding practice is to always use C99 pointer-width 
types (inptr_t, uintptr_t, ptrdiff_t) when doing pointer arithmetic.


More information about the mesa-dev mailing list