+2007-11-01 Peter Kasting <zerodpx@gmail.com>
+
+ Reviewed by Dave Hyatt.
+
+ http://bugs.webkit.org/show_bug.cgi?id=15778
+ Malformed GIFs should not result in memory corruption.
+
+ * platform/image-decoders/gif/GIFImageDecoder.cpp:
+ (WebCore::GIFImageDecoder::haveDecodedRow):
+ * platform/image-decoders/gif/GIFImageReader.cpp:
+ (GIFImageReader::output_row):
+ (GIFImageReader::read):
+
2007-10-31 Adam Roben <aroben@apple.com>
Fix a crash when parsing a cubic-bezier function
{
GIFFrameReader* gs = frame_reader;
- int width, drow_start, drow_end;
+ int drow_start, drow_end;
drow_start = drow_end = gs->irow;
if ((unsigned)drow_start >= gs->height)
return;
- /* Check for scanline below edge of logical screen */
- if ((gs->y_offset + gs->irow) < screen_height) {
- /* Clip if right edge of image exceeds limits */
- if ((gs->x_offset + gs->width) > screen_width)
- width = screen_width - gs->x_offset;
- else
- width = gs->width;
-
- // CALLBACK: Let the client know we have decoded a row.
- if (width > 0 && clientptr && frame_reader)
- clientptr->haveDecodedRow(images_count - 1, frame_reader->rowbuf, frame_reader->rowend,
- drow_start, drow_end - drow_start + 1);
- }
+ // CALLBACK: Let the client know we have decoded a row.
+ if (clientptr && frame_reader)
+ clientptr->haveDecodedRow(images_count - 1, frame_reader->rowbuf, frame_reader->rowend,
+ drow_start, drow_end - drow_start + 1);
gs->rowp = gs->rowbuf;
/* XXX Deviant! */
delete []frame_reader->rowbuf;
- frame_reader->rowbuf = new unsigned char[width];
-
- if (!frame_reader->rowbuf) {
- state = gif_oom;
- break;
- }
-
screen_width = width;
- if (screen_height < frame_reader->height)
- screen_height = frame_reader->height;
- }
- else {
- if (!frame_reader->rowbuf)
- frame_reader->rowbuf = new unsigned char[screen_width];
+ frame_reader->rowbuf = new unsigned char[screen_width];
+ } else if (!frame_reader->rowbuf) {
+ frame_reader->rowbuf = new unsigned char[screen_width];
}
if (!frame_reader->rowbuf) {
state = gif_oom;
break;
}
+ if (screen_height < height)
+ screen_height = height;
if (q[8] & 0x40) {
frame_reader->interlaced = true;