Re: Crash in Gimp 1.1.7 on Solaris 8.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



In regard to: Crash in Gimp 1.1.7 on Solaris 8., Ludovic Poitou said (at...:

>signal BUS (invalid address alignment) in color_pixels at 0x177858
>color_pixels+0x110:     ld      [%l0], %i1

You don't say what architecture you're running on, but Solaris 7 or later on
an Ultra would be a LP64 (i.e. 64 bit) OS, so an invalid address alignment
would be indicative of incorrect alignment of a pointer.  I'm not certain,
but odds are good that pointers in Solaris 8 must be aligned on 8-byte
boundaries, as opposed to ints which could be aligned on 4-byte boundaries.

>  register unsigned char c0, c1, c2;
>  register guint32 *longd, longc;
>  register guint16 *shortd, shortc;

I can't tell by the code what the intent is, but these definitions have
longd as a pointer (an 8-byte quantity on LP64 machines) while longc is
an unsigned 32-bit quantity (*not* a pointer).  Ditto for shortd and shortc.

>  switch (bytes)
>  {
>   case 1:
>     memset(dest, *color, w);
>     break;
>   case 2:
>     shortc = ((guint16 *)color)[0];

This is probably also a problem here -- shortc isn't big enough to hold
an address.

>     shortd = (guint16 *)dest;
>     while (w--)
>     {
>       *shortd = shortc;
>       shortd++;
>     }
>     break;
>   case 3:
>     c0 = color[0];
>     c1 = color[1];
>     c2 = color[2];
>     while (w--)
>     {
>       dest[0] = c0;
>       dest[1] = c1;
>       dest[2] = c2;
>       dest += 3;
>     }
>     break;
>   case 4:
>     longc = ((guint32 *)color)[0];   <<<< Crash here !

longc is a 32 bit quantity, which isn't big enough to hold an address on
LP64 machines.   That's probably why you're getting the crash.  I bet I
would get the same result (or at least an "unaligned access" warning) on
my Tru64 Unix box.

>     longd = (guint32 *)dest;
>     while (w--)
>     {
>       *longd = longc;
>       longd++;
>     }
>     break;
>   default:
>   {
>     int b;
>     while (w--)
>     {
>       for (b = 0; b < bytes; b++)
>         dest[b] = color[b];
>
>       dest += bytes;
>     }
>   }
>  }
>}

I'm not sure what the right fix is, being I haven't looked long enough at
the code to decipher what's going on.  The problem is almost certainly a 32 bit
vs. 64 bit issue, though.

Tim
-- 
Tim Mooney                              mooney@xxxxxxxxxxxxxxxxxxxxxxxxx
Information Technology Services         (701) 231-1076 (Voice)
Room 242-J1, IACC Building              (701) 231-8541 (Fax)
North Dakota State University, Fargo, ND 58105-5164



[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux