"Göran Uddeborg" <[EMAIL PROTECTED]> writes: > Romain Francoise writes: >> Can you reproduce the bug with the latest Emacs sources from CVS? Your >> reports mention Emacs 21.3 an 21.4, this codebase is very old. > > I managed to find some time to do this test at last. Current CVS > emacs crashes too. > > I also tried to understand what the problem is. The GIF image is > strange. Doing identify on it gives this output: > > /tmp/poison.gif[0] GIF 450x33 450x33+0+235 PseudoClass 64c 31kb 0.000u 0:01 > /tmp/poison.gif[1] GIF 53x76 450x33+53+116 PseudoClass 64c 31kb 0.000u 0:01 > /tmp/poison.gif[2] GIF 53x75 450x33+53+115 PseudoClass 64c 31kb 0.000u 0:01 > /tmp/poison.gif[3] GIF 59x77 450x33+30+115 PseudoClass 64c 31kb 0.000u 0:01 > /tmp/poison.gif[4] GIF 50x70 450x33+24+122 PseudoClass 64c 31kb 0.000u 0:01 > /tmp/poison.gif[5] GIF 54x71 450x33+20+129 PseudoClass 64c 31kb 0.000u 0:01 > > I don't know in detail what those sizes attributes represent. But > single stepping through gif_load in image.c I note that it first calls > x_create_x_image_and_pixmap() with width=450 and height=200. Later on > it computes image_top to 235. Thus, in the first loop after the > assignment of image_top it lets y loop from 0 to 234, and does an > XPutPixel for each x and y value. The crash happens with y==200, > which is the first row not allocated in ximg. > > I don't quite understand all aspects here. But my impression is that > the bug is indeed in emacs. It gets fooled somehow by this > nonstandard GIF image.
Seems so. Does this patch give good results? *** image.c 31 Aug 2005 11:18:06 +0200 1.33 --- image.c 27 Sep 2005 23:32:35 +0200 *************** *** 7369,7376 **** return 0; } ! width = img->width = max (gif->SWidth, gif->Image.Left + gif->ImageWidth); ! height = img->height = max (gif->SHeight, gif->Image.Top + gif->Image.Height); /* Create the X image and pixmap. */ if (!x_create_x_image_and_pixmap (f, width, height, 0, &ximg, &img->pixmap)) --- 7369,7385 ---- return 0; } ! image_top = gif->SavedImages[ino].ImageDesc.Top; ! image_left = gif->SavedImages[ino].ImageDesc.Left; ! image_width = gif->SavedImages[ino].ImageDesc.Width; ! image_height = gif->SavedImages[ino].ImageDesc.Height; ! ! width = img->width = max (gif->SWidth, ! max (gif->Image.Left + gif->Image.Width, ! image_left + image_width)); ! height = img->height = max (gif->SHeight, ! max (gif->Image.Top + gif->Image.Height, ! image_top + image_height)); /* Create the X image and pixmap. */ if (!x_create_x_image_and_pixmap (f, width, height, 0, &ximg, &img->pixmap)) *************** *** 7405,7415 **** requires more than can be done here (see the gif89 spec, disposal methods). Let's simply assume that the part not covered by a sub-image is in the frame's background color. */ - image_top = gif->SavedImages[ino].ImageDesc.Top; - image_left = gif->SavedImages[ino].ImageDesc.Left; - image_width = gif->SavedImages[ino].ImageDesc.Width; - image_height = gif->SavedImages[ino].ImageDesc.Height; - for (y = 0; y < image_top; ++y) for (x = 0; x < width; ++x) XPutPixel (ximg, x, y, FRAME_BACKGROUND_PIXEL (f)); --- 7414,7419 ---- -- Kim F. Storm <[EMAIL PROTECTED]> http://www.cua.dk _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel