[Gtkradiant] Bug with libs/ddslib/ddslib.c lines 693 to 723 on 64 bit systems.

Randy Reddig ydnar at shaderlab.com
Thu Mar 13 21:09:13 CDT 2008


Nice!

On Mar 13, 2008, at 4:05 PM, Branan Riley wrote:

> Switching surface from a void pointer to an unsigned int seems to have
> fixed the crashes and image corruption. I've also fixed some of the
> DDS loading functions to use size_t instead of unsigned int when
> casting to/from pointers.
>
>
> Index: libs/ddslib.h
> ===================================================================
> --- libs/ddslib.h (revision 204)
> +++ libs/ddslib.h (working copy)
> @@ -181,7 +181,7 @@
>   };
>   unsigned int      alphaBitDepth;
>   unsigned int      reserved;
> -  void           *surface;
> +  unsigned int      surface;
>   union
>   {
>      ddsColorKey_t  ckDestOverlay;
> Index: libs/ddslib/ddslib.c
> ===================================================================
> --- libs/ddslib/ddslib.c   (revision 204)
> +++ libs/ddslib/ddslib.c   (working copy)
> @@ -523,7 +523,7 @@
>   for( y = 0; y < yBlocks; y++ )
>   {
>      /* 8 bytes per block */
> -     block = (ddsColorBlock_t*) ((unsigned int) dds->data + y *  
> xBlocks * 8);
> +     block = (ddsColorBlock_t*) ((size_t) dds->data + y * xBlocks *  
> 8);
>
>      /* walk x */
>      for( x = 0; x < xBlocks; x++, block++ )
> @@ -569,7 +569,7 @@
>   for( y = 0; y < yBlocks; y++ )
>   {
>      /* 8 bytes per block, 1 block for alpha, 1 block for color */
> -     block = (ddsColorBlock_t*) ((unsigned int) dds->data + y *  
> xBlocks * 16);
> +     block = (ddsColorBlock_t*) ((size_t) dds->data + y * xBlocks *  
> 16);
>
>      /* walk x */
>      for( x = 0; x < xBlocks; x++, block++ )
> @@ -625,7 +625,7 @@
>   for( y = 0; y < yBlocks; y++ )
>   {
>      /* 8 bytes per block, 1 block for alpha, 1 block for color */
> -     block = (ddsColorBlock_t*) ((unsigned int) dds->data + y *  
> xBlocks * 16);
> +     block = (ddsColorBlock_t*) ((size_t) dds->data + y * xBlocks *  
> 16);
>
>      /* walk x */
>      for( x = 0; x < xBlocks; x++, block++ )
>
>
>
> On Thu, Mar 13, 2008 at 2:03 PM, Randy Reddig <ydnar at shaderlab.com>  
> wrote:
>> If the loaded struct has a size_t or void *, then replace it with an
>> int and handle it as a 32-bit integer.
>>
>> Randy
>>
>>
>>
>>
>> On Mar 13, 2008, at 1:12 PM, Branan Riley wrote:
>>
>>> Has anyone figured this out yet? I glanced over the code that
>>> determines width and height, and it looks OK to me.
>>>
>>> When the DDS data is loaded, how is it done? is it a chunk of memory
>>> that's cast to a ddsBuffer_t*? if so, the problem might be alignment
>>> issues caused by "void* surface" on line 184 of ddslib.h. Other than
>>> that, my cursory glance reveals nothing of use.
>>>
>>> On Thu, Jan 17, 2008 at 6:37 AM, Forest Hale
>>> <lordhavoc at ghdigital.com> wrote:
>>>> Jay Dolan wrote:
>>>>> Forest Hale wrote:
>>>>>>
>>>>>> All pointers are always the same size on a given architecture,
>>>>>> the bug is somewhere else (possibly in the dds width/height
>>>>>> reading for example?).
>>>>>>
>>>>>> Note that sizeof(size_t) is always equal to sizeof(void *),
>>>>>> size_t is the correct type to use when pointer-size integer
>>>>>> arithmetic is needed.
>>>>>>
>>>>>>
>>>>> I thought ptrdiff_t was recommended for such things.  Same-same,
>>>>> maybe?
>>>>
>>>> ptrdiff_t is not part of ANSI C, so you can't count on it existing,
>>>> if I recall correctly MSVS2005 lacks it but I may be thinking of
>>>> older versions.
>>>>
>>>> The other difference is that ptrdiff_t is signed, size_t is  
>>>> unsigned.
>>>>
>>>>
>>>> --
>>>> LordHavoc
>>>> Author of DarkPlaces Quake1 engine and mod
>>>> http://icculus.org/twilight/darkplaces/
>>>> "War does not prove who is right, it proves who is left." - Unknown
>>>> "Any sufficiently advanced technology is indistinguishable from a
>>>> rigged demo." - James Klass
>>>>
>>>>
>>>> _______________________________________________
>>>>
>>>>
>>>> Gtkradiant mailing list
>>>> Gtkradiant at zerowing.idsoftware.com
>>>> http://zerowing.idsoftware.com/cgi-bin/mailman/listinfo/gtkradiant
>>>>
>>>
>>> _______________________________________________
>>> Gtkradiant mailing list
>>> Gtkradiant at zerowing.idsoftware.com
>>> http://zerowing.idsoftware.com/cgi-bin/mailman/listinfo/gtkradiant
>>
>>
>> _______________________________________________
>> Gtkradiant mailing list
>> Gtkradiant at zerowing.idsoftware.com
>> http://zerowing.idsoftware.com/cgi-bin/mailman/listinfo/gtkradiant
>>
>
> _______________________________________________
> Gtkradiant mailing list
> Gtkradiant at zerowing.idsoftware.com
> http://zerowing.idsoftware.com/cgi-bin/mailman/listinfo/gtkradiant




More information about the Gtkradiant mailing list