7058607: GIF parser bugs found via zzuf fuzzing
Reviewed-by: prr, vadim
This commit is contained in:
parent
89b5a10c5f
commit
a1e06f7eac
@ -115,6 +115,8 @@ public class GIFImageReader extends ImageReader {
|
|||||||
// The current interlace pass, starting with 0.
|
// The current interlace pass, starting with 0.
|
||||||
int interlacePass = 0;
|
int interlacePass = 0;
|
||||||
|
|
||||||
|
private byte[] fallbackColorTable = null;
|
||||||
|
|
||||||
// End per-stream settings
|
// End per-stream settings
|
||||||
|
|
||||||
// Constants used to control interlacing.
|
// Constants used to control interlacing.
|
||||||
@ -239,10 +241,22 @@ public class GIFImageReader extends ImageReader {
|
|||||||
byte[] colorTable;
|
byte[] colorTable;
|
||||||
if (imageMetadata.localColorTable != null) {
|
if (imageMetadata.localColorTable != null) {
|
||||||
colorTable = imageMetadata.localColorTable;
|
colorTable = imageMetadata.localColorTable;
|
||||||
|
fallbackColorTable = imageMetadata.localColorTable;
|
||||||
} else {
|
} else {
|
||||||
colorTable = streamMetadata.globalColorTable;
|
colorTable = streamMetadata.globalColorTable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (colorTable == null) {
|
||||||
|
if (fallbackColorTable == null) {
|
||||||
|
this.processWarningOccurred("Use default color table.");
|
||||||
|
|
||||||
|
// no color table, the spec allows to use any palette.
|
||||||
|
fallbackColorTable = getDefaultPalette();
|
||||||
|
}
|
||||||
|
|
||||||
|
colorTable = fallbackColorTable;
|
||||||
|
}
|
||||||
|
|
||||||
// Normalize color table length to 2^1, 2^2, 2^4, or 2^8
|
// Normalize color table length to 2^1, 2^2, 2^4, or 2^8
|
||||||
int length = colorTable.length/3;
|
int length = colorTable.length/3;
|
||||||
int bits;
|
int bits;
|
||||||
@ -1036,5 +1050,34 @@ public class GIFImageReader extends ImageReader {
|
|||||||
streamY = -1;
|
streamY = -1;
|
||||||
rowsDone = 0;
|
rowsDone = 0;
|
||||||
interlacePass = 0;
|
interlacePass = 0;
|
||||||
|
|
||||||
|
fallbackColorTable = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] defaultPalette = null;
|
||||||
|
|
||||||
|
private static synchronized byte[] getDefaultPalette() {
|
||||||
|
if (defaultPalette == null) {
|
||||||
|
BufferedImage img = new BufferedImage(1, 1,
|
||||||
|
BufferedImage.TYPE_BYTE_INDEXED);
|
||||||
|
IndexColorModel icm = (IndexColorModel) img.getColorModel();
|
||||||
|
|
||||||
|
final int size = icm.getMapSize();
|
||||||
|
byte[] r = new byte[size];
|
||||||
|
byte[] g = new byte[size];
|
||||||
|
byte[] b = new byte[size];
|
||||||
|
icm.getReds(r);
|
||||||
|
icm.getGreens(g);
|
||||||
|
icm.getBlues(b);
|
||||||
|
|
||||||
|
defaultPalette = new byte[size * 3];
|
||||||
|
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
defaultPalette[3 * i + 0] = r[i];
|
||||||
|
defaultPalette[3 * i + 1] = g[i];
|
||||||
|
defaultPalette[3 * i + 2] = b[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defaultPalette;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user