diff --git a/src/share/classes/sun/awt/image/GifImageDecoder.java b/src/share/classes/sun/awt/image/GifImageDecoder.java index aa87fb82ef76280ab472d9923b719286fe623b03..b0679afc437d9dd4da6b694791a4edcdc43b6434 100644 --- a/src/share/classes/sun/awt/image/GifImageDecoder.java +++ b/src/share/classes/sun/awt/image/GifImageDecoder.java @@ -585,9 +585,16 @@ public class GifImageDecoder extends ImageDecoder { System.out.print("Reading a " + width + " by " + height + " " + (interlace ? "" : "non-") + "interlaced image..."); } - + int initCodeSize = ExtractByte(block, 9); + if (initCodeSize >= 12) { + if (verbose) { + System.out.println("Invalid initial code size: " + + initCodeSize); + } + return false; + } boolean ret = parseImage(x, y, width, height, - interlace, ExtractByte(block, 9), + interlace, initCodeSize, block, rasline, model); if (!ret) { diff --git a/src/share/native/sun/awt/image/gif/gifdecoder.c b/src/share/native/sun/awt/image/gif/gifdecoder.c index 1429931f8c6dba78ce9967a8be296126a22d011c..893007f136670ce778f4444011784897c80ff8ef 100644 --- a/src/share/native/sun/awt/image/gif/gifdecoder.c +++ b/src/share/native/sun/awt/image/gif/gifdecoder.c @@ -191,6 +191,11 @@ Java_sun_awt_image_GifImageDecoder_parseImage(JNIEnv *env, int passht = passinc; int len; + /* We have verified the initial code size on the java layer. + * Here we just check bounds for particular indexes. */ + if (freeCode >= 4096 || maxCode >= 4096) { + return 0; + } if (blockh == 0 || raslineh == 0 || prefixh == 0 || suffixh == 0 || outCodeh == 0)